diff --git a/pkg/web/templates/base.html b/pkg/web/templates/base.html
index 51a8f9b6291c4e00b99f1d3496e98e0d00a7cb15..d5eb8cddd23e65d242ef1dd3ecaf4b70190dc648 100644
--- a/pkg/web/templates/base.html
+++ b/pkg/web/templates/base.html
@@ -5,8 +5,8 @@
   
   
   
-  
{{if .Repo}}{{if .Repo.ProjectName}}{{.Repo.ProjectName}}{{else}}{{.Repo.Name}}{{end}}{{else}}{{.ServerName}}{{end}}
-  {{if .Repo}}{{if .Repo.Description}}{{end}}{{end}}
+  {{.Title}}
+  {{if .Description}}{{end}}
   
   
   
diff --git a/pkg/web/webui.go b/pkg/web/webui.go
index c2e8ad45c8cf8b412a69af475f3dd3761e22e966..56c6595a12d3db9aaaa09e53ea85199348be50b2 100644
--- a/pkg/web/webui.go
+++ b/pkg/web/webui.go
@@ -39,8 +39,10 @@ const (
 
 // BaseData contains common fields for all web UI pages.
 type BaseData struct {
-	ServerName string
-	ActiveTab  string
+	ServerName  string
+	ActiveTab   string
+	Title       string
+	Description string
 }
 
 // RepoBaseData contains common fields for repository-specific pages.
@@ -103,8 +105,8 @@ var templateFuncs = template.FuncMap{
 		default:
 			hashStr = fmt.Sprintf("%v", hash)
 		}
-		if len(hashStr) > 8 {
-			return hashStr[:8]
+		if len(hashStr) > 7 {
+			return hashStr[:7]
 		}
 		return hashStr
 	},
diff --git a/pkg/web/webui_about.go b/pkg/web/webui_about.go
index cf7942df26106a21f9f591365dda3d5c992e5efe..e737627725fde85c91cc244291732ff43955fb08 100644
--- a/pkg/web/webui_about.go
+++ b/pkg/web/webui_about.go
@@ -37,6 +37,7 @@ func about(w http.ResponseWriter, r *http.Request) {
 		BaseData: BaseData{
 			ServerName: cfg.Name,
 			ActiveTab:  "about",
+			Title:      "About | " + cfg.Name,
 		},
 		ReadmeHTML: readmeHTML,
 	}
diff --git a/pkg/web/webui_blob.go b/pkg/web/webui_blob.go
index a3e2177fee8b8ce9d0b3e775254c98b2602fd8ac..843eff380c88c8c023d7c0a173ad0e38ad3a6317 100644
--- a/pkg/web/webui_blob.go
+++ b/pkg/web/webui_blob.go
@@ -99,11 +99,18 @@ func repoBlob(w http.ResponseWriter, r *http.Request) {
 		renderedHTML = highlightCode(path, content)
 	}
 
+	repoDisplayName := repo.ProjectName()
+	if repoDisplayName == "" {
+		repoDisplayName = repo.Name()
+	}
+	fileName := filepath.Base(path)
+
 	data := BlobData{
 		RepoBaseData: RepoBaseData{
 			BaseData: BaseData{
 				ServerName: cfg.Name,
 				ActiveTab:  "tree",
+				Title:      fileName + " | " + repoDisplayName,
 			},
 			Repo:          repo,
 			DefaultBranch: defaultBranch,
diff --git a/pkg/web/webui_branches.go b/pkg/web/webui_branches.go
index 73f8f58fecaac5090c36932eb23d6d76418bd653..1d632443fbc7275395ce4708be4822990c86b247 100644
--- a/pkg/web/webui_branches.go
+++ b/pkg/web/webui_branches.go
@@ -88,11 +88,17 @@ func repoBranches(w http.ResponseWriter, r *http.Request) {
 		})
 	}
 
+	repoDisplayName := repo.ProjectName()
+	if repoDisplayName == "" {
+		repoDisplayName = repo.Name()
+	}
+
 	data := BranchesData{
 		RepoBaseData: RepoBaseData{
 			BaseData: BaseData{
 				ServerName: cfg.Name,
 				ActiveTab:  "branches",
+				Title:      "Branches | " + repoDisplayName,
 			},
 			Repo:          repo,
 			DefaultBranch: defaultBranch,
diff --git a/pkg/web/webui_commit.go b/pkg/web/webui_commit.go
index 869d759de13d730ca54aebae737e463aa035de5c..4a63672a8bea57df73eb5900efbfad63ae197ad2 100644
--- a/pkg/web/webui_commit.go
+++ b/pkg/web/webui_commit.go
@@ -2,6 +2,7 @@ package web
 
 import (
 	"net/http"
+	"strings"
 
 	"github.com/charmbracelet/log/v2"
 	"github.com/charmbracelet/soft-serve/git"
@@ -57,11 +58,35 @@ func repoCommit(w http.ResponseWriter, r *http.Request) {
 		}
 	}
 
+	commitSubject := commit.Message
+	commitBody := ""
+	if lines := strings.Split(commit.Message, "\n"); len(lines) > 0 {
+		commitSubject = lines[0]
+		if len(lines) > 1 {
+			commitBody = strings.TrimSpace(strings.Join(lines[1:], "\n"))
+			if len(commitBody) > 200 {
+				commitBody = commitBody[:200] + "..."
+			}
+		}
+	}
+
+	repoDisplayName := repo.ProjectName()
+	if repoDisplayName == "" {
+		repoDisplayName = repo.Name()
+	}
+
+	shortHash := hash
+	if len(hash) > 7 {
+		shortHash = hash[:7]
+	}
+
 	data := CommitData{
 		RepoBaseData: RepoBaseData{
 			BaseData: BaseData{
-				ServerName: cfg.Name,
-				ActiveTab:  "commits",
+				ServerName:  cfg.Name,
+				ActiveTab:   "commits",
+				Title:       commitSubject + " | Commit " + shortHash + " | " + repoDisplayName,
+				Description: commitBody,
 			},
 			Repo:          repo,
 			DefaultBranch: defaultBranch,
diff --git a/pkg/web/webui_commits.go b/pkg/web/webui_commits.go
index 26f534ff6d847d2552778abb4271b9b707213a0d..46cf892fd07965a933981852e239e6f3caabffe9 100644
--- a/pkg/web/webui_commits.go
+++ b/pkg/web/webui_commits.go
@@ -82,11 +82,17 @@ func repoCommits(w http.ResponseWriter, r *http.Request) {
 
 	defaultBranch := getDefaultBranch(gr)
 
+	repoDisplayName := repo.ProjectName()
+	if repoDisplayName == "" {
+		repoDisplayName = repo.Name()
+	}
+
 	data := CommitsData{
 		RepoBaseData: RepoBaseData{
 			BaseData: BaseData{
 				ServerName: cfg.Name,
 				ActiveTab:  "commits",
+				Title:      "Commits in " + ref + " | " + repoDisplayName,
 			},
 			Repo:          repo,
 			DefaultBranch: defaultBranch,
diff --git a/pkg/web/webui_home.go b/pkg/web/webui_home.go
index 956f1060efb342884bb41f6bcfcdbd6b1b765561..c8130acb0b02e5c11fdbd6be2b82b863b6b04951 100644
--- a/pkg/web/webui_home.go
+++ b/pkg/web/webui_home.go
@@ -154,6 +154,7 @@ func home(w http.ResponseWriter, r *http.Request) {
 		BaseData: BaseData{
 			ServerName: cfg.Name,
 			ActiveTab:  "repositories",
+			Title:      cfg.Name,
 		},
 		PaginationData: PaginationData{
 			Page:        page,
diff --git a/pkg/web/webui_overview.go b/pkg/web/webui_overview.go
index 0def6bc6db7abd72c8b3b7a5b9eaefc118101e3f..7b14bc97f29038e66a916da635a4ff2029129807 100644
--- a/pkg/web/webui_overview.go
+++ b/pkg/web/webui_overview.go
@@ -50,11 +50,18 @@ func repoOverview(w http.ResponseWriter, r *http.Request) {
 		}
 	}
 
+	repoDisplayName := repo.ProjectName()
+	if repoDisplayName == "" {
+		repoDisplayName = repo.Name()
+	}
+
 	data := OverviewData{
 		RepoBaseData: RepoBaseData{
 			BaseData: BaseData{
-				ServerName: cfg.Name,
-				ActiveTab:  "overview",
+				ServerName:  cfg.Name,
+				ActiveTab:   "overview",
+				Title:       repoDisplayName,
+				Description: repo.Description(),
 			},
 			Repo:          repo,
 			DefaultBranch: defaultBranch,
diff --git a/pkg/web/webui_tags.go b/pkg/web/webui_tags.go
index 4e92606369261b014f659dcce406cae92bb95361..032faa2929772517b15260762853c2c2808ea128 100644
--- a/pkg/web/webui_tags.go
+++ b/pkg/web/webui_tags.go
@@ -108,11 +108,17 @@ func repoTags(w http.ResponseWriter, r *http.Request) {
 		})
 	}
 
+	repoDisplayName := repo.ProjectName()
+	if repoDisplayName == "" {
+		repoDisplayName = repo.Name()
+	}
+
 	data := TagsData{
 		RepoBaseData: RepoBaseData{
 			BaseData: BaseData{
 				ServerName: cfg.Name,
 				ActiveTab:  "tags",
+				Title:      "Tags | " + repoDisplayName,
 			},
 			Repo:          repo,
 			DefaultBranch: defaultBranch,
diff --git a/pkg/web/webui_tree.go b/pkg/web/webui_tree.go
index d9ecbe1488d5e3ffda9811b8825a8c89561db998..edccf39439c77a260492c5ccf621d9d444124df4 100644
--- a/pkg/web/webui_tree.go
+++ b/pkg/web/webui_tree.go
@@ -72,11 +72,17 @@ func repoTree(w http.ResponseWriter, r *http.Request) {
 
 	defaultBranch := getDefaultBranch(gr)
 
+	repoDisplayName := repo.ProjectName()
+	if repoDisplayName == "" {
+		repoDisplayName = repo.Name()
+	}
+
 	data := TreeData{
 		RepoBaseData: RepoBaseData{
 			BaseData: BaseData{
 				ServerName: cfg.Name,
 				ActiveTab:  "tree",
+				Title:      "Files | " + repoDisplayName,
 			},
 			Repo:          repo,
 			DefaultBranch: defaultBranch,