diff --git a/routers/web/home.go b/routers/web/home.go
index d4be0931e8..4ea961c055 100644
--- a/routers/web/home.go
+++ b/routers/web/home.go
@@ -61,6 +61,9 @@ func Home(ctx *context.Context) {
 
 	ctx.Data["PageIsHome"] = true
 	ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
+
+	ctx.Data["OpenGraphDescription"] = setting.UI.Meta.Description
+
 	ctx.HTML(http.StatusOK, tplHome)
 }
 
diff --git a/routers/web/org/home.go b/routers/web/org/home.go
index 9ebefa334c..1b58d8fde9 100644
--- a/routers/web/org/home.go
+++ b/routers/web/org/home.go
@@ -47,6 +47,12 @@ func Home(ctx *context.Context) {
 	ctx.Data["PageIsUserProfile"] = true
 	ctx.Data["Title"] = org.DisplayName()
 
+	ctx.Data["OpenGraphTitle"] = ctx.ContextUser.DisplayName()
+	ctx.Data["OpenGraphType"] = "profile"
+	ctx.Data["OpenGraphImageURL"] = ctx.ContextUser.AvatarLink(ctx)
+	ctx.Data["OpenGraphURL"] = ctx.ContextUser.HTMLURL()
+	ctx.Data["OpenGraphDescription"] = ctx.ContextUser.Description
+
 	var orderBy db.SearchOrderBy
 	sortOrder := ctx.FormString("sort")
 	if _, ok := repo_model.OrderByFlatMap[sortOrder]; !ok {
diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go
index a06da71429..2feb898224 100644
--- a/routers/web/repo/commit.go
+++ b/routers/web/repo/commit.go
@@ -419,6 +419,10 @@ func Diff(ctx *context.Context) {
 		}
 	}
 
+	ctx.Data["OpenGraphTitle"] = commit.Summary() + " ยท " + base.ShortSha(commitID)
+	ctx.Data["OpenGraphURL"] = fmt.Sprintf("%s/commit/%s", ctx.Repo.Repository.HTMLURL(), commitID)
+	_, ctx.Data["OpenGraphDescription"], _ = strings.Cut(commit.Message(), "\n")
+
 	ctx.HTML(http.StatusOK, tplCommitPage)
 }
 
diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go
index 779cbd4b6a..b537afdab5 100644
--- a/routers/web/repo/issue.go
+++ b/routers/web/repo/issue.go
@@ -2070,6 +2070,9 @@ func ViewIssue(ctx *context.Context) {
 	ctx.Data["RefEndName"] = git.RefName(issue.Ref).ShortName()
 	ctx.Data["NewPinAllowed"] = pinAllowed
 	ctx.Data["PinEnabled"] = setting.Repository.Issue.MaxPinned != 0
+	ctx.Data["OpenGraphTitle"] = issue.Title
+	ctx.Data["OpenGraphURL"] = issue.HTMLURL()
+	ctx.Data["OpenGraphDescription"] = issue.Content
 	ctx.Data["OpenGraphImageURL"] = issue.SummaryCardURL()
 	ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.issues.summary_card_alt", issue.Title, issue.Repo.FullName())
 
diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go
index fd8c1da058..9030b03a90 100644
--- a/routers/web/repo/view.go
+++ b/routers/web/repo/view.go
@@ -394,6 +394,10 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
 	ctx.Data["FileName"] = blob.Name()
 	ctx.Data["RawFileLink"] = ctx.Repo.RepoLink + "/raw/" + ctx.Repo.BranchNameSubURL() + "/" + util.PathEscapeSegments(ctx.Repo.TreePath)
 
+	ctx.Data["OpenGraphTitle"] = ctx.Data["Title"]
+	ctx.Data["OpenGraphURL"] = fmt.Sprintf("%s%s", setting.AppURL, ctx.Data["Link"])
+	ctx.Data["OpenGraphNoDescription"] = true
+
 	if entry.IsLink() {
 		_, link, err := entry.FollowLinks()
 		// Errors should be allowed, because this shouldn't
diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go
index 3d55afe294..070d07cdf3 100644
--- a/routers/web/repo/wiki.go
+++ b/routers/web/repo/wiki.go
@@ -535,6 +535,9 @@ func Wiki(ctx *context.Context) {
 	}
 	ctx.Data["Author"] = lastCommit.Author
 
+	ctx.Data["OpenGraphTitle"] = ctx.Data["Title"]
+	ctx.Data["OpenGraphURL"] = fmt.Sprintf("%s%s", setting.AppURL, ctx.Data["Link"])
+
 	ctx.HTML(http.StatusOK, tplWikiView)
 }
 
diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go
index 9cb392d878..de1c6850aa 100644
--- a/routers/web/user/profile.go
+++ b/routers/web/user/profile.go
@@ -63,6 +63,12 @@ func userProfile(ctx *context.Context) {
 	ctx.Data["Title"] = ctx.ContextUser.DisplayName()
 	ctx.Data["PageIsUserProfile"] = true
 
+	ctx.Data["OpenGraphTitle"] = ctx.ContextUser.DisplayName()
+	ctx.Data["OpenGraphType"] = "profile"
+	ctx.Data["OpenGraphImageURL"] = ctx.ContextUser.AvatarLink(ctx)
+	ctx.Data["OpenGraphURL"] = ctx.ContextUser.HTMLURL()
+	ctx.Data["OpenGraphDescription"] = ctx.ContextUser.Description
+
 	// prepare heatmap data
 	if setting.Service.EnableUserHeatmap {
 		data, err := activities_model.GetUserHeatmapDataByUser(ctx, ctx.ContextUser, ctx.Doer)
diff --git a/services/context/repo.go b/services/context/repo.go
index 462d843bfc..d294c00455 100644
--- a/services/context/repo.go
+++ b/services/context/repo.go
@@ -634,6 +634,10 @@ func RepoAssignment(ctx *Context) context.CancelFunc {
 	}
 
 	cardWidth, cardHeight := card.DefaultSize()
+	ctx.Data["OpenGraphTitle"] = repo.Name
+	ctx.Data["OpenGraphURL"] = repo.HTMLURL()
+	ctx.Data["OpenGraphType"] = "object"
+	ctx.Data["OpenGraphDescription"] = repo.Description
 	ctx.Data["OpenGraphImageURL"] = repo.SummaryCardURL()
 	ctx.Data["OpenGraphImageWidth"] = cardWidth
 	ctx.Data["OpenGraphImageHeight"] = cardHeight
diff --git a/templates/base/head_opengraph.tmpl b/templates/base/head_opengraph.tmpl
index 692f1797b6..7f6eae3f49 100644
--- a/templates/base/head_opengraph.tmpl
+++ b/templates/base/head_opengraph.tmpl
@@ -1,12 +1,24 @@
-{{- /* og:description - a one to two sentence description of your object, maybe it only needs at most 300 bytes */ -}}
+{{- /* See https://ogp.me for specification */ -}}
 {{if .OpenGraphTitle}}
 	<meta property="og:title" content="{{.OpenGraphTitle}}">
+{{else if .Title}}
+	<meta property="og:title" content="{{.Title}}">
+{{else}}
+	<meta property="og:title" content="{{AppDisplayName}}">
 {{end}}
-{{if .OpenGraphDescription}}
-	<meta property="og:description" content="{{.OpenGraphDescription}}">
+{{- /* og:description - a one to two sentence description of your object, maybe it only needs at most 300 bytes */ -}}
+{{if and .OpenGraphDescription (not .OpenGraphNoDescription)}}
+	<meta property="og:description" content="{{StringUtils.EllipsisString .OpenGraphDescription 300}}">
 {{end}}
 {{if .OpenGraphURL}}
 	<meta property="og:url" content="{{.OpenGraphURL}}">
+{{else}}
+	<meta property="og:url" content="{{AppUrl}}{{.Link}}">
+{{end}}
+{{if .OpenGraphType}}
+	<meta property="og:type" content="{{.OpenGraphType}}">
+{{else}}
+	<meta property="og:type" content="website">
 {{end}}
 {{if .OpenGraphImageURL}}
 	<meta property="og:image" content="{{.OpenGraphImageURL}}">
@@ -19,62 +31,7 @@
 	{{if .OpenGraphImageAltText}}
 		<meta property="og:image:alt" content="{{.OpenGraphImageAltText}}">
 	{{end}}
-{{end}}
-{{if .PageIsUserProfile}}
-	<meta property="og:title" content="{{.ContextUser.DisplayName}}">
-	<meta property="og:type" content="profile">
-	<meta property="og:image" content="{{.ContextUser.AvatarLink ctx}}">
-	<meta property="og:url" content="{{.ContextUser.HTMLURL}}">
-	{{if .ContextUser.Description}}
-		<meta property="og:description" content="{{StringUtils.EllipsisString .ContextUser.Description 300}}">
-	{{end}}
-{{else if .Repository}}
-	{{if .Issue}}
-		<meta property="og:title" content="{{.Issue.Title}}">
-		<meta property="og:url" content="{{.Issue.HTMLURL}}">
-		{{if .Issue.Content}}
-			<meta property="og:description" content="{{StringUtils.EllipsisString .Issue.Content 300}}">
-		{{end}}
-	{{else if or .PageIsDiff .IsViewFile}}
-		<meta property="og:title" content="{{.Title}}">
-		<meta property="og:url" content="{{AppUrl}}{{.Link}}">
-		{{if and .PageIsDiff .Commit}}
-			{{- $commitMessageParts := StringUtils.Cut .Commit.Message "\n" -}}
-			{{- $commitMessageBody := index $commitMessageParts 1 -}}
-			{{- if $commitMessageBody -}}
-				<meta property="og:description" content="{{StringUtils.EllipsisString $commitMessageBody 300}}">
-			{{- end -}}
-		{{end}}
-	{{else if .Pages}}
-		<meta property="og:title" content="{{.Title}}">
-		<meta property="og:url" content="{{AppUrl}}{{.Link}}">
-		{{if .Repository.Description}}
-			<meta property="og:description" content="{{StringUtils.EllipsisString .Repository.Description 300}}">
-		{{end}}
-	{{else}}
-		{{if not .OpenGraphTitle}}
-			<meta property="og:title" content="{{.Repository.Name}}">
-		{{end}}
-		{{if not .OpenGraphURL}}
-			<meta property="og:url" content="{{.Repository.HTMLURL}}">
-		{{end}}
-		{{if and (.Repository.Description) (not .OpenGraphDescription)}}
-			<meta property="og:description" content="{{StringUtils.EllipsisString .Repository.Description 300}}">
-		{{end}}
-	{{end}}
-	<meta property="og:type" content="object">
-	{{if and (not .Issue) (not .OpenGraphImageURL)}}
-		{{if (.Repository.AvatarLink ctx)}}
-			<meta property="og:image" content="{{.Repository.AvatarLink ctx}}">
-		{{else}}
-			<meta property="og:image" content="{{.Repository.Owner.AvatarLink ctx}}">
-		{{end}}
-	{{end}}
 {{else}}
-	<meta property="og:title" content="{{AppDisplayName}}">
-	<meta property="og:type" content="website">
-	<meta property="og:image" content="{{AssetUrlPrefix}}/img/logo.png">
-	<meta property="og:url" content="{{AppUrl}}">
-	<meta property="og:description" content="{{MetaDescription}}">
+		<meta property="og:image" content="{{AssetUrlPrefix}}/img/logo.png">
 {{end}}
 <meta property="og:site_name" content="{{AppDisplayName}}">