diff --git a/internal/godoc/parse.go b/internal/godoc/parse.go
deleted file mode 100644
index 436220e..0000000
--- a/internal/godoc/parse.go
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The functions in this file are intended to aid frontend development for the
-// unit page, and is a temporary solution for prototyping the new designs. It is
-// not intended for use in production.
-
-package godoc
-
-import (
-	"context"
-	"fmt"
-	"regexp"
-	"strings"
-
-	"github.com/google/safehtml"
-	"github.com/google/safehtml/uncheckedconversions"
-	"golang.org/x/pkgsite/internal/derrors"
-	"golang.org/x/pkgsite/internal/middleware"
-)
-
-// SectionType is a section of the docHTML.
-type SectionType uint32
-
-const (
-	// SidenavSection is the section of the docHTML starting at
-	// dochtml.IdentifierSidenav and ending at the last </nav> tag in the
-	// docHTML. This is inclusive of SideNavMobile.
-	SidenavSection SectionType = iota
-	// SidenavMobileSection is the section of the docHTML starting at
-	// dochtml.IdentifierMobileNavStart and ending at the last </nav> tag in the
-	// docHTML.
-	SidenavMobileSection
-	// BodySection is the section of the docHTML starting at
-	// dochtml.IdentifierBody and ending at the last </div> tag in the
-	// docHTML.
-	BodySection
-)
-
-const (
-	IdentifierBodyStart          = `<div class="Documentation-content js-docContent">`
-	IdentifierBodyEnd            = `</div>`
-	IdentifierSidenavStart       = `<nav class="DocNav js-sideNav">`
-	IdentifierSidenavMobileStart = `<nav class="DocNavMobile js-mobileNav">`
-	IdentifierSidenavEnd         = `</nav>`
-)
-
-// ParseDoc splits docHTML into sections.
-func ParseDoc(ctx context.Context, docHTML safehtml.HTML) (body, outline, mobileOutline safehtml.HTML, err error) {
-	// TODO: Deprecate this. The sidenav and body can
-	// either be rendered using separate functions, or all this content can
-	// be passed to the template via the UnitPage struct.
-	defer middleware.ElapsedStat(ctx, "godoc.ParseDoc")()
-	b, err := parse(docHTML, BodySection)
-	if err != nil {
-		return safehtml.HTML{}, safehtml.HTML{}, safehtml.HTML{}, err
-	}
-	o, err := parse(docHTML, SidenavSection)
-	if err != nil {
-		return safehtml.HTML{}, safehtml.HTML{}, safehtml.HTML{}, err
-	}
-	m, err := parse(docHTML, SidenavMobileSection)
-	if err != nil {
-		return safehtml.HTML{}, safehtml.HTML{}, safehtml.HTML{}, err
-	}
-	o = uncheckedconversions.HTMLFromStringKnownToSatisfyTypeContract(strings.TrimSuffix(o.String(), m.String()))
-	return b, o, m, nil
-}
-
-// parse returns the section of docHTML specified by section. It is expected that
-// docHTML was generated using the template in internal/fetch/dochtml.
-func parse(docHTML safehtml.HTML, section SectionType) (_ safehtml.HTML, err error) {
-	defer derrors.Wrap(&err, "Parse(docHTML, %q)", section)
-	switch section {
-	case SidenavSection:
-		return findHTML(docHTML, IdentifierSidenavStart)
-	case SidenavMobileSection:
-		return findHTML(docHTML, IdentifierSidenavMobileStart)
-	case BodySection:
-		return findHTML(docHTML, IdentifierBodyStart)
-	default:
-		return safehtml.HTML{}, derrors.NotFound
-	}
-}
-
-func findHTML(docHTML safehtml.HTML, identifier string) (_ safehtml.HTML, err error) {
-	defer derrors.Wrap(&err, "findHTML(%q)", identifier)
-	var closeTag string
-	switch identifier {
-	case IdentifierBodyStart:
-		closeTag = IdentifierBodyEnd
-	default:
-		closeTag = IdentifierSidenavEnd
-	}
-
-	// The regex is greedy, so it will capture the last matching closeTag in
-	// the docHTML.
-	//
-	// For the sidenav, this will capture both the mobile and main
-	// sidenav sections. For the body, this will capture all content up the
-	// last </div> tag in the HTML.
-	reg := fmt.Sprintf("(%s(.|\n)*%s)", identifier, closeTag)
-	s := regexp.MustCompile(reg).FindString(docHTML.String())
-	return uncheckedconversions.HTMLFromStringKnownToSatisfyTypeContract(s), nil
-}
diff --git a/internal/godoc/parse_test.go b/internal/godoc/parse_test.go
deleted file mode 100644
index cf68442..0000000
--- a/internal/godoc/parse_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package godoc
-
-import (
-	"testing"
-
-	"github.com/google/go-cmp/cmp"
-	"github.com/google/safehtml/uncheckedconversions"
-)
-
-func TestParse(t *testing.T) {
-	for _, test := range []struct {
-		name, want string
-		section    SectionType
-	}{
-		{
-			name:    "sidenav",
-			section: SidenavSection,
-			want:    quoteSidenav,
-		},
-		{
-			name:    "sidenav-mobile",
-			section: SidenavMobileSection,
-			want:    quoteSidenavMobile,
-		},
-		{
-			name:    "body",
-			section: BodySection,
-			want:    quoteBody,
-		},
-	} {
-		{
-			t.Run(test.name, func(t *testing.T) {
-				got, err := parse(uncheckedconversions.HTMLFromStringKnownToSatisfyTypeContract(quoteDocHTML), test.section)
-				if err != nil {
-					t.Fatal(err)
-				}
-				if diff := cmp.Diff(test.want, got.String()); diff != "" {
-					t.Errorf("mismatch (-want +got):\n%s", diff)
-				}
-			})
-		}
-	}
-}
