diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go
index 33e7f739ff..1998bd8ccd 100644
--- a/routers/web/repo/release.go
+++ b/routers/web/repo/release.go
@@ -279,6 +279,8 @@ func SingleRelease(ctx *context.Context) {
 	releases, err := getReleaseInfos(ctx, &repo_model.FindReleasesOptions{
 		ListOptions: db.ListOptions{Page: 1, PageSize: 1},
 		RepoID:      ctx.Repo.Repository.ID,
+		// Include tags in the search too.
+		IncludeTags: true,
 		TagNames:    []string{ctx.Params("*")},
 		// only show draft releases for users who can write, read-only users shouldn't see draft releases.
 		IncludeDrafts: writeAccess,
diff --git a/tests/integration/repo_tag_test.go b/tests/integration/repo_tag_test.go
index 7e77906473..d2c4160602 100644
--- a/tests/integration/repo_tag_test.go
+++ b/tests/integration/repo_tag_test.go
@@ -1,9 +1,11 @@
 // Copyright 2021 The Gitea Authors. All rights reserved.
+// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved.
 // SPDX-License-Identifier: MIT
 
 package integration
 
 import (
+	"net/http"
 	"net/url"
 	"testing"
 
@@ -20,6 +22,34 @@ import (
 	"github.com/stretchr/testify/assert"
 )
 
+func TestTagViewWithoutRelease(t *testing.T) {
+	defer tests.PrepareTestEnv(t)()
+
+	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
+	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
+
+	defer func() {
+		releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{
+			IncludeTags: true,
+			TagNames:    []string{"no-release"},
+			RepoID:      repo.ID,
+		})
+		assert.NoError(t, err)
+
+		for _, release := range releases {
+			_, err = db.DeleteByID[repo_model.Release](db.DefaultContext, release.ID)
+			assert.NoError(t, err)
+		}
+	}()
+
+	err := release.CreateNewTag(git.DefaultContext, owner, repo, "master", "no-release", "release-less tag")
+	assert.NoError(t, err)
+
+	// Test that the page loads
+	req := NewRequestf(t, "GET", "/%s/releases/tag/no-release", repo.FullName())
+	MakeRequest(t, req, http.StatusOK)
+}
+
 func TestCreateNewTagProtected(t *testing.T) {
 	defer tests.PrepareTestEnv(t)()