diff --git a/all_test.go b/all_test.go
index 2e16df4..d8c3634 100644
--- a/all_test.go
+++ b/all_test.go
@@ -81,8 +81,8 @@
 			if len(lints) > 0 {
 				t.Errorf(strings.Join(lints, "\n"))
 			}
-			goID := report.GetGoIDFromFilename(filename)
-			for _, alias := range r.GetAliases() {
+			goID := report.GoID(filename)
+			for _, alias := range r.Aliases() {
 				if report, ok := aliases[alias]; ok {
 					t.Errorf("report %s shares duplicate alias %s with report %s", filename, alias, report)
 				} else {
@@ -91,8 +91,8 @@
 			}
 			// Check that a correct OSV file was generated for each YAML report.
 			if r.Excluded == "" {
-				generated := r.GenerateOSVEntry(goID, time.Time{})
-				osvFilename := report.GetOSVFilename(goID)
+				generated := r.ToOSV(goID, time.Time{})
+				osvFilename := report.OSVFilename(goID)
 				current, err := report.ReadOSV(osvFilename)
 				if err != nil {
 					t.Fatal(err)
@@ -109,7 +109,7 @@
 				if err != nil {
 					t.Fatal(err)
 				}
-				cvePath := report.GetCVEFilename(goID)
+				cvePath := report.CVEFilename(goID)
 				current, err := cveschema5.Read(cvePath)
 				if err != nil {
 					t.Fatal(err)
diff --git a/cmd/cve/main.go b/cmd/cve/main.go
index 517c5e0..da71ef7 100644
--- a/cmd/cve/main.go
+++ b/cmd/cve/main.go
@@ -71,7 +71,7 @@
 		logFatalUsageErr("cve", fmt.Errorf("must provide subcommand"))
 	}
 
-	c := cveclient.New(*getCfgFromFlags())
+	c := cveclient.New(*cfgFromFlags())
 
 	cmd := flag.Arg(0)
 	switch cmd {
@@ -80,7 +80,7 @@
 	case "reserve":
 		year := *year
 		if year == 0 {
-			year = getCurrentYear()
+			year = currentYear()
 		}
 		mode := cveclient.SequentialRequest
 		if !*reserveSequential {
@@ -159,12 +159,12 @@
 	log.Fatalf("%s: %s\n", context, err)
 }
 
-func getCurrentYear() int {
+func currentYear() int {
 	year, _, _ := time.Now().Date()
 	return year
 }
 
-func getCfgFromFlags() *cveclient.Config {
+func cfgFromFlags() *cveclient.Config {
 	if *test {
 		if *testApiKey == "" {
 			logFatalUsageErr("cve", errors.New("the test CVE API key (flag -test-key or env var TEST_CVE_API_KEY) must be set in test env"))
@@ -321,7 +321,7 @@
 		if err != nil {
 			return err
 		}
-		fmt.Printf("%s is published at %s\n", cveID, c.GetWebURL(cveID))
+		fmt.Printf("%s is published at %s\n", cveID, c.WebURL(cveID))
 		if diff := cmp.Diff(existing.Containers, *toPublish); diff != "" {
 			fmt.Printf("publish would update record with diff (-existing, +new):\n%s\n", diff)
 		} else {
@@ -351,7 +351,7 @@
 		return err
 	}
 
-	fmt.Printf("successfully %sd record for %s at %s\n", action, cveID, c.GetWebURL(cveID))
+	fmt.Printf("successfully %sd record for %s at %s\n", action, cveID, c.WebURL(cveID))
 
 	return nil
 }
diff --git a/cmd/issue/main.go b/cmd/issue/main.go
index bb48f34..eda12c6 100644
--- a/cmd/issue/main.go
+++ b/cmd/issue/main.go
@@ -127,7 +127,7 @@
 	if err != nil {
 		return err
 	}
-	_, allReports, err := report.GetAllExisting(repo)
+	_, allReports, err := report.All(repo)
 	if err != nil {
 		return err
 	}
diff --git a/cmd/vulnreport/main.go b/cmd/vulnreport/main.go
index 4adbc06..5e926e9 100644
--- a/cmd/vulnreport/main.go
+++ b/cmd/vulnreport/main.go
@@ -156,7 +156,7 @@
 		if err != nil {
 			log.Fatal(err)
 		}
-		_, existingByFile, err := report.GetAllExisting(repo)
+		_, existingByFile, err := report.All(repo)
 		if err != nil {
 			log.Fatal(err)
 		}
@@ -259,7 +259,7 @@
 	if err != nil {
 		log.Fatal(err)
 	}
-	existingByIssue, existingByFile, err := report.GetAllExisting(localRepo)
+	existingByIssue, existingByFile, err := report.All(localRepo)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -322,7 +322,7 @@
 func create(ctx context.Context, issueNumber int, cfg *createCfg) (err error) {
 	defer derrors.Wrap(&err, "create(%d)", issueNumber)
 	// Get GitHub issue.
-	iss, err := cfg.issuesClient.GetIssue(ctx, issueNumber)
+	iss, err := cfg.issuesClient.Issue(ctx, issueNumber)
 	if err != nil {
 		return err
 	}
@@ -332,7 +332,7 @@
 		return err
 	}
 
-	filename := r.GetYAMLFilename(iss.NewGoID())
+	filename := r.YAMLFilename(iss.NewGoID())
 	if err := r.Write(filename); err != nil {
 		return err
 	}
@@ -348,7 +348,7 @@
 	}
 	r.Fix()
 
-	filename := r.GetYAMLFilename(iss.NewGoID())
+	filename := r.YAMLFilename(iss.NewGoID())
 	if err := r.Write(filename); err != nil {
 		return "", err
 	}
@@ -375,7 +375,7 @@
 	}
 	for _, label := range excludedLabels {
 		tempIssues, err :=
-			cfg.issuesClient.GetIssues(ctx, issues.GetIssuesOptions{Labels: []string{label}, State: stateOption})
+			cfg.issuesClient.Issues(ctx, issues.IssuesOptions{Labels: []string{label}, State: stateOption})
 		if err != nil {
 			return err
 		}
@@ -398,7 +398,7 @@
 			continue
 		}
 		successfulIssNums = append(successfulIssNums, fmt.Sprintf("golang/vulndb#%d", iss.Number))
-		successfulGoIDs = append(successfulGoIDs, report.GetGoIDFromFilename(filename))
+		successfulGoIDs = append(successfulGoIDs, report.GoID(filename))
 	}
 	fmt.Printf("Skipped %d issues\n", skipped)
 
@@ -688,7 +688,7 @@
 	if err := r.Write(filename); err != nil {
 		return err
 	}
-	goID := report.GetGoIDFromFilename(filename)
+	goID := report.GoID(filename)
 	if _, err := writeOSV(r, goID); err != nil {
 		return err
 	}
@@ -867,7 +867,7 @@
 	if err != nil {
 		return err
 	}
-	osvFilename, err := writeOSV(r, report.GetGoIDFromFilename(filename))
+	osvFilename, err := writeOSV(r, report.GoID(filename))
 	if err != nil {
 		return err
 	}
@@ -877,8 +877,8 @@
 
 func writeOSV(r *report.Report, goID string) (string, error) {
 	if r.Excluded == "" {
-		entry := r.GenerateOSVEntry(goID, time.Time{})
-		osvFilename := report.GetOSVFilename(goID)
+		entry := r.ToOSV(goID, time.Time{})
+		osvFilename := report.OSVFilename(goID)
 		if err := database.WriteJSON(osvFilename, entry, true); err != nil {
 			return "", err
 		}
@@ -893,7 +893,7 @@
 	if err != nil {
 		return err
 	}
-	return writeCVE(r, report.GetGoIDFromFilename(filename))
+	return writeCVE(r, report.GoID(filename))
 }
 
 // writeCVE takes a report and its Go ID, converts the report
@@ -905,7 +905,7 @@
 	var cve *cveschema5.CVERecord
 	var err error
 
-	cvePath := report.GetCVEFilename(goID)
+	cvePath := report.CVEFilename(goID)
 	if cve, err = r.ToCVE5(goID); err != nil {
 		return err
 	}
@@ -945,12 +945,12 @@
 
 	// Find all derived files (OSV and CVE).
 	files := []string{filename}
-	goID := report.GetGoIDFromFilename(filename)
+	goID := report.GoID(filename)
 	if r.Excluded == "" {
-		files = append(files, report.GetOSVFilename(goID))
+		files = append(files, report.OSVFilename(goID))
 	}
 	if r.CVEMetadata != nil {
-		files = append(files, report.GetCVEFilename(goID))
+		files = append(files, report.CVEFilename(goID))
 	}
 
 	// Add the files.
@@ -996,7 +996,7 @@
 
 	return fmt.Sprintf(
 		"%s: %s %s\n\nAliases: %s\n\n%s golang/vulndb#%d",
-		folder, fileAction, filename, strings.Join(r.GetAliases(), ", "),
+		folder, fileAction, filename, strings.Join(r.Aliases(), ", "),
 		issueAction, issueID), nil
 }
 
@@ -1163,7 +1163,7 @@
 // addGHSAs adds any missing GHSAs that correspond to the CVEs in the report.
 func addGHSAs(ctx context.Context, r *report.Report, ghsaClient *ghsa.Client) error {
 	ghsas := r.GHSAs
-	for _, cve := range r.GetCVEs() {
+	for _, cve := range r.AllCVEs() {
 		sas, err := ghsaClient.ListForCVE(ctx, cve)
 		if err != nil {
 			return err
diff --git a/cmd/worker/main.go b/cmd/worker/main.go
index 8a916e8..6cf690c 100644
--- a/cmd/worker/main.go
+++ b/cmd/worker/main.go
@@ -258,7 +258,7 @@
 	if err != nil {
 		return err
 	}
-	_, allReports, err := report.GetAllExisting(repo)
+	_, allReports, err := report.All(repo)
 	if err != nil {
 		return err
 	}
diff --git a/internal/cveclient/cveclient.go b/internal/cveclient/cveclient.go
index c7e0a42..b80b33c 100644
--- a/internal/cveclient/cveclient.go
+++ b/internal/cveclient/cveclient.go
@@ -40,9 +40,9 @@
 	c *http.Client
 }
 
-// GetWebURL returns the URL that can be used to view a published
+// WebURL returns the URL that can be used to view a published
 // CVE record on the web.
-func (c *Client) GetWebURL(cveID string) string {
+func (c *Client) WebURL(cveID string) string {
 	baseURL := WebURL
 	if c.Config.Endpoint == TestEndpoint {
 		baseURL = TestWebURL
@@ -132,7 +132,7 @@
 	NonsequentialRequest RequestType = "nonsequential"
 )
 
-func (o *ReserveOptions) getURLParams(org string) url.Values {
+func (o *ReserveOptions) urlParams(org string) url.Values {
 	params := url.Values{}
 	params.Set("amount", fmt.Sprint(o.NumIDs))
 	if o.Year != 0 {
@@ -147,11 +147,11 @@
 
 func (c *Client) createReserveIDsRequest(opts ReserveOptions) (*http.Request, error) {
 	req, err := c.createRequest(http.MethodPost,
-		c.getURL(cveIDTarget), nil)
+		c.requestURL(cveIDTarget), nil)
 	if err != nil {
 		return nil, err
 	}
-	req.URL.RawQuery = opts.getURLParams(c.Org).Encode()
+	req.URL.RawQuery = opts.urlParams(c.Org).Encode()
 	return req, err
 }
 
@@ -188,24 +188,24 @@
 
 // RetrieveQuota queries the API for the organizations reservation quota.
 func (c *Client) RetrieveQuota() (q *Quota, err error) {
-	err = c.queryAPI(http.MethodGet, c.getURL(orgTarget, c.Org, quotaTarget), nil, &q)
+	err = c.queryAPI(http.MethodGet, c.requestURL(orgTarget, c.Org, quotaTarget), nil, &q)
 	return
 }
 
 // RetrieveID requests information about an assigned CVE ID.
 func (c *Client) RetrieveID(id string) (cve *AssignedCVE, err error) {
-	err = c.queryAPI(http.MethodGet, c.getURL(cveIDTarget, id), nil, &cve)
+	err = c.queryAPI(http.MethodGet, c.requestURL(cveIDTarget, id), nil, &cve)
 	return
 }
 
 // RetrieveRecord requests a CVE record.
 func (c *Client) RetrieveRecord(id string) (cve *cveschema5.CVERecord, err error) {
-	err = c.queryAPI(http.MethodGet, c.getURL(cveTarget, id), nil, &cve)
+	err = c.queryAPI(http.MethodGet, c.requestURL(cveTarget, id), nil, &cve)
 	return
 }
 
-func (c *Client) getCVERecordEndpoint(cveID string) string {
-	return c.getURL(cveTarget, cveID, cnaTarget)
+func (c *Client) cveRecordEndpoint(cveID string) string {
+	return c.requestURL(cveTarget, cveID, cnaTarget)
 }
 
 type recordRequestBody struct {
@@ -220,7 +220,7 @@
 		CNAContainer: record.CNAContainer,
 	}
 	var response createResponse
-	err := c.queryAPI(http.MethodPost, c.getCVERecordEndpoint(id), requestBody, &response)
+	err := c.queryAPI(http.MethodPost, c.cveRecordEndpoint(id), requestBody, &response)
 	if err != nil {
 		return nil, err
 	}
@@ -236,7 +236,7 @@
 		CNAContainer: record.CNAContainer,
 	}
 	var response updateResponse
-	err := c.queryAPI(http.MethodPut, c.getCVERecordEndpoint(id), requestBody, &response)
+	err := c.queryAPI(http.MethodPut, c.cveRecordEndpoint(id), requestBody, &response)
 	if err != nil {
 		return nil, err
 	}
@@ -251,7 +251,7 @@
 
 // RetrieveOrg requests information about an organization.
 func (c *Client) RetrieveOrg() (org *Org, err error) {
-	err = c.queryAPI(http.MethodGet, c.getURL(orgTarget, c.Org), nil, &org)
+	err = c.queryAPI(http.MethodGet, c.requestURL(orgTarget, c.Org), nil, &org)
 	return
 }
 
@@ -289,7 +289,7 @@
 	return strings.Join(s, ", ")
 }
 
-func (o *ListOptions) getURLParams() url.Values {
+func (o *ListOptions) urlParams() url.Values {
 	params := url.Values{}
 	if o == nil {
 		return params
@@ -322,11 +322,11 @@
 }
 
 func (c Client) createListOrgCVEsRequest(opts *ListOptions, page int) (req *http.Request, err error) {
-	req, err = c.createRequest(http.MethodGet, c.getURL(cveIDTarget), nil)
+	req, err = c.createRequest(http.MethodGet, c.requestURL(cveIDTarget), nil)
 	if err != nil {
 		return nil, err
 	}
-	params := opts.getURLParams()
+	params := opts.urlParams()
 	if page > 0 {
 		params.Set("page", fmt.Sprint(page))
 	}
@@ -432,7 +432,7 @@
 	cnaTarget   = "cna"
 )
 
-func (c *Client) getURL(targets ...string) string {
+func (c *Client) requestURL(targets ...string) string {
 	return fmt.Sprintf("%s/api/%s", c.Endpoint, strings.Join(targets, "/"))
 }
 
diff --git a/internal/cveclient/cveclient_test.go b/internal/cveclient/cveclient_test.go
index f8bc3ee..4531f4a 100644
--- a/internal/cveclient/cveclient_test.go
+++ b/internal/cveclient/cveclient_test.go
@@ -54,7 +54,7 @@
 	return record
 }
 
-var getDefaultTestCVERecord = func(t *testing.T) *cveschema5.CVERecord {
+var defaultTestCVERecord = func(t *testing.T) *cveschema5.CVERecord {
 	return readTestData(t, "basic-example.json")
 }
 
@@ -212,16 +212,16 @@
 		return c.RetrieveQuota()
 	}
 	retrieveIDQuery = func(t *testing.T, c *Client) (any, error) {
-		return c.RetrieveID(getDefaultTestCVERecord(t).Metadata.ID)
+		return c.RetrieveID(defaultTestCVERecord(t).Metadata.ID)
 	}
 	retrieveRecordQuery = func(t *testing.T, c *Client) (any, error) {
-		return c.RetrieveRecord(getDefaultTestCVERecord(t).Metadata.ID)
+		return c.RetrieveRecord(defaultTestCVERecord(t).Metadata.ID)
 	}
 	createRecordQuery = func(t *testing.T, c *Client) (any, error) {
-		return c.CreateRecord(defaultTestCVE.ID, &getDefaultTestCVERecord(t).Containers)
+		return c.CreateRecord(defaultTestCVE.ID, &defaultTestCVERecord(t).Containers)
 	}
 	updateRecordQuery = func(t *testing.T, c *Client) (any, error) {
-		return c.UpdateRecord(defaultTestCVE.ID, &getDefaultTestCVERecord(t).Containers)
+		return c.UpdateRecord(defaultTestCVE.ID, &defaultTestCVERecord(t).Containers)
 	}
 	retrieveOrgQuery = func(t *testing.T, c *Client) (any, error) {
 		return c.RetrieveOrg()
@@ -232,7 +232,7 @@
 )
 
 func TestAllSuccess(t *testing.T) {
-	defaultTestCVERecord := getDefaultTestCVERecord(t)
+	defaultTestCVERecord := defaultTestCVERecord(t)
 	tests := []struct {
 		name           string
 		mockStatus     int
diff --git a/internal/database/legacydb/load.go b/internal/database/legacydb/load.go
index 2b91117..a572b82 100644
--- a/internal/database/legacydb/load.go
+++ b/internal/database/legacydb/load.go
@@ -102,7 +102,7 @@
 			if fname == indexFile {
 				return nil
 			}
-			id := report.GetGoIDFromFilename(fname)
+			id := report.GoID(fname)
 			if _, ok := d.EntriesByID[id]; !ok {
 				return fmt.Errorf("found unexpected file %q which is not present in %s", fname, filepath.Join(idDirectory, indexFile))
 			}
diff --git a/internal/issues/issues.go b/internal/issues/issues.go
index cef3093..aaaae51 100644
--- a/internal/issues/issues.go
+++ b/internal/issues/issues.go
@@ -27,8 +27,8 @@
 	CreatedAt time.Time
 }
 
-// GetIssuesOptions are options for GetIssues
-type GetIssuesOptions struct {
+// IssuesOptions are options for Issues
+type IssuesOptions struct {
 	// State filters issues based on their state. Possible values are: open,
 	// closed, all. Default is "open".
 	State string
@@ -135,9 +135,9 @@
 	return iss
 }
 
-// GetIssue returns the issue with the given issue number.
-func (c *Client) GetIssue(ctx context.Context, number int) (_ *Issue, err error) {
-	defer derrors.Wrap(&err, "GetIssue(%d)", number)
+// Issue returns the issue with the given issue number.
+func (c *Client) Issue(ctx context.Context, number int) (_ *Issue, err error) {
+	defer derrors.Wrap(&err, "Issue(%d)", number)
 	ghIss, _, err := c.GitHub.Issues.Get(ctx, c.Owner, c.Repo, number)
 	if err != nil {
 		return nil, err
@@ -147,9 +147,9 @@
 	return iss, nil
 }
 
-// GetIssues returns all Github issues that match the filters in opts.
-func (c *Client) GetIssues(ctx context.Context, opts GetIssuesOptions) (_ []*Issue, err error) {
-	defer derrors.Wrap(&err, "GetIssues()")
+// Issues returns all Github issues that match the filters in opts.
+func (c *Client) Issues(ctx context.Context, opts IssuesOptions) (_ []*Issue, err error) {
+	defer derrors.Wrap(&err, "Issues()")
 	clientOpts := &github.IssueListByRepoOptions{
 		State:  opts.State,
 		Labels: opts.Labels,
diff --git a/internal/issues/issues_test.go b/internal/issues/issues_test.go
index 8185f92..eb2debf 100644
--- a/internal/issues/issues_test.go
+++ b/internal/issues/issues_test.go
@@ -54,7 +54,7 @@
 	}
 }
 
-func TestGetIssueAndIssueExists(t *testing.T) {
+func TestIssueAndIssueExists(t *testing.T) {
 	c, mux := githubtest.Setup(context.Background(), t, testConfig)
 	want := &issues.Issue{
 		Number: 7,
@@ -69,7 +69,7 @@
 		}
 	})
 	ctx := context.Background()
-	got, err := c.GetIssue(ctx, want.Number)
+	got, err := c.Issue(ctx, want.Number)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -85,7 +85,7 @@
 	}
 }
 
-func TestGetIssues(t *testing.T) {
+func TestIssues(t *testing.T) {
 	c, mux := githubtest.Setup(context.Background(), t, testConfig)
 	iss := &issues.Issue{
 		Number: 1,
@@ -106,7 +106,7 @@
 	})
 	ctx := context.Background()
 	want := []*issues.Issue{iss, iss2}
-	got, err := c.GetIssues(ctx, issues.GetIssuesOptions{State: "open"})
+	got, err := c.Issues(ctx, issues.IssuesOptions{State: "open"})
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/internal/issues/real_test.go b/internal/issues/real_test.go
index 1b2ceda..720e31c 100644
--- a/internal/issues/real_test.go
+++ b/internal/issues/real_test.go
@@ -80,7 +80,7 @@
 	if !gotExists {
 		t.Error("created issue doesn't exist")
 	}
-	gotIss, err := c.GetIssue(ctx, num)
+	gotIss, err := c.Issue(ctx, num)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -95,7 +95,7 @@
 	}
 
 	want := []*Issue{iss, iss2}
-	got, err := c.GetIssues(ctx, GetIssuesOptions{Labels: []string{"testing"}})
+	got, err := c.Issues(ctx, IssuesOptions{Labels: []string{"testing"}})
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -104,7 +104,7 @@
 		t.Errorf("mismatch (-want, +got):\n%s", diff)
 	}
 	want = []*Issue{iss2}
-	got, err = c.GetIssues(ctx, GetIssuesOptions{Labels: []string{"other"}})
+	got, err = c.Issues(ctx, IssuesOptions{Labels: []string{"other"}})
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/internal/report/cve.go b/internal/report/cve.go
index 5fdbd13..5b1c9e1 100644
--- a/internal/report/cve.go
+++ b/internal/report/cve.go
@@ -12,7 +12,7 @@
 	"golang.org/x/vulndb/internal/stdlib"
 )
 
-func getVendor(modulePath string) string {
+func vendor(modulePath string) string {
 	switch modulePath {
 	case stdlib.ModulePath:
 		return "Go standard library"
diff --git a/internal/report/cve5.go b/internal/report/cve5.go
index 876a706..8dfb7ef 100644
--- a/internal/report/cve5.go
+++ b/internal/report/cve5.go
@@ -75,7 +75,7 @@
 		}
 		for _, p := range m.Packages {
 			affected := cveschema5.Affected{
-				Vendor:        getVendor(m.Module),
+				Vendor:        vendor(m.Module),
 				Product:       p.Package,
 				CollectionURL: "https://pkg.go.dev",
 				PackageName:   p.Package,
@@ -93,7 +93,7 @@
 	for _, ref := range r.References {
 		c.References = append(c.References, cveschema5.Reference{URL: ref.URL})
 	}
-	advisoryLink := GetGoAdvisoryLink(goID)
+	advisoryLink := GoAdvisory(goID)
 	c.References = append(c.References, cveschema5.Reference{URL: advisoryLink})
 
 	for _, credit := range r.Credits {
@@ -115,7 +115,7 @@
 	}, nil
 }
 
-func GetCVEFilename(goID string) string {
+func CVEFilename(goID string) string {
 	return filepath.Join(cve5Dir, goID+".json")
 }
 
diff --git a/internal/report/cve5_test.go b/internal/report/cve5_test.go
index 2fcbfcc..4ed02ac 100644
--- a/internal/report/cve5_test.go
+++ b/internal/report/cve5_test.go
@@ -263,7 +263,7 @@
 			if err != nil {
 				t.Fatal(err)
 			}
-			got, err := r.ToCVE5(GetGoIDFromFilename(test.filename))
+			got, err := r.ToCVE5(GoID(test.filename))
 			if err != nil {
 				t.Fatalf("ToCVE5(%s) failed unexpectedly; err=%v", test.filename, err)
 			}
@@ -274,9 +274,9 @@
 	}
 }
 
-func TestGetCVEFilename(t *testing.T) {
+func TestCVEFilename(t *testing.T) {
 	want := "data/cve/v5/GO-1999-0001.json"
-	if got := GetCVEFilename("GO-1999-0001"); got != want {
+	if got := CVEFilename("GO-1999-0001"); got != want {
 		t.Errorf("got %s, want %s", got, want)
 	}
 }
diff --git a/internal/report/osv.go b/internal/report/osv.go
index 4ed6934..47284f9 100644
--- a/internal/report/osv.go
+++ b/internal/report/osv.go
@@ -29,10 +29,10 @@
 	SchemaVersion = "1.3.1"
 )
 
-// GenerateOSVEntry create an osv.Entry for a report.
+// ToOSV creates an osv.Entry for a report.
 // In addition to the report, it takes the ID for the vuln and the time
 // the vuln was last modified.
-func (r *Report) GenerateOSVEntry(goID string, lastModified time.Time) osv.Entry {
+func (r *Report) ToOSV(goID string, lastModified time.Time) osv.Entry {
 	var credits []osv.Credit
 	for _, credit := range r.Credits {
 		credits = append(credits, osv.Credit{
@@ -53,11 +53,11 @@
 		Details:          trimWhitespace(r.Description),
 		Credits:          credits,
 		SchemaVersion:    SchemaVersion,
-		DatabaseSpecific: &osv.DatabaseSpecific{URL: GetGoAdvisoryLink(goID)},
+		DatabaseSpecific: &osv.DatabaseSpecific{URL: GoAdvisory(goID)},
 	}
 
 	for _, m := range r.Modules {
-		entry.Affected = append(entry.Affected, generateAffected(m))
+		entry.Affected = append(entry.Affected, toAffected(m))
 	}
 	for _, ref := range r.References {
 		entry.References = append(entry.References, osv.Reference{
@@ -65,11 +65,11 @@
 			URL:  ref.URL,
 		})
 	}
-	entry.Aliases = r.GetAliases()
+	entry.Aliases = r.Aliases()
 	return entry
 }
 
-func GetOSVFilename(goID string) string {
+func OSVFilename(goID string) string {
 	return filepath.Join(OSVDir, goID+".json")
 }
 
@@ -134,8 +134,8 @@
 	return s
 }
 
-func generateImports(m *Module) (imps []osv.Package) {
-	for _, p := range m.Packages {
+func toOSVPackages(pkgs []*Package) (imps []osv.Package) {
+	for _, p := range pkgs {
 		syms := append([]string{}, p.Symbols...)
 		syms = append(syms, p.DerivedSymbols...)
 		sort.Strings(syms)
@@ -149,7 +149,7 @@
 	return imps
 }
 
-func generateAffected(m *Module) osv.Affected {
+func toAffected(m *Module) osv.Affected {
 	name := m.Module
 	switch name {
 	case stdlib.ModulePath:
@@ -164,7 +164,7 @@
 		},
 		Ranges: AffectedRanges(m.Versions),
 		EcosystemSpecific: &osv.EcosystemSpecific{
-			Packages: generateImports(m),
+			Packages: toOSVPackages(m.Packages),
 		},
 	}
 }
diff --git a/internal/report/osv_test.go b/internal/report/osv_test.go
index c85085b..a2c1d97 100644
--- a/internal/report/osv_test.go
+++ b/internal/report/osv_test.go
@@ -13,7 +13,7 @@
 	"golang.org/x/vulndb/internal/osv"
 )
 
-func TestGenerateOSVEntry(t *testing.T) {
+func TestToOSV(t *testing.T) {
 	r := &Report{
 		Modules: []*Module{
 			{
@@ -200,20 +200,20 @@
 		DatabaseSpecific: &osv.DatabaseSpecific{URL: "https://pkg.go.dev/vuln/GO-1991-0001"},
 	}
 
-	gotEntry := r.GenerateOSVEntry("GO-1991-0001", time.Time{})
+	gotEntry := r.ToOSV("GO-1991-0001", time.Time{})
 	if diff := cmp.Diff(wantEntry, gotEntry, cmp.Comparer(func(a, b time.Time) bool { return a.Equal(b) })); diff != "" {
 		t.Errorf("GenerateOSVEntry returned unexpected entry (-want +got):\n%s", diff)
 	}
 }
 
-func TestGetOSVFilename(t *testing.T) {
+func TestOSVFilename(t *testing.T) {
 	want := "data/osv/GO-1999-0001.json"
-	if got := GetOSVFilename("GO-1999-0001"); got != want {
+	if got := OSVFilename("GO-1999-0001"); got != want {
 		t.Errorf("got %s, want %s", got, want)
 	}
 }
 
-func TestSemverCanonicalize(t *testing.T) {
+func TestAffectedRanges(t *testing.T) {
 	in := []VersionRange{
 		{
 			Introduced: "1.16.0",
diff --git a/internal/report/report.go b/internal/report/report.go
index ce586b2..01e7375 100644
--- a/internal/report/report.go
+++ b/internal/report/report.go
@@ -133,17 +133,17 @@
 	CVEMetadata *CVEMeta `yaml:"cve_metadata,omitempty"`
 }
 
-// GetCVEs returns all CVE IDs for a report.
-func (r *Report) GetCVEs() []string {
+// AllCVEs returns all CVE IDs for a report, including any in cve_metadata.
+func (r *Report) AllCVEs() []string {
 	if r.CVEMetadata != nil {
 		return []string{r.CVEMetadata.ID}
 	}
 	return r.CVEs
 }
 
-// GetAliases returns all aliases (e.g., CVEs, GHSAs) for a report.
-func (r *Report) GetAliases() []string {
-	return append(r.GetCVEs(), r.GHSAs...)
+// Aliases returns all aliases (e.g., CVEs, GHSAs) for a report.
+func (r *Report) Aliases() []string {
+	return append(r.AllCVEs(), r.GHSAs...)
 }
 
 const (
@@ -152,11 +152,13 @@
 	goURLPrefix   = "https://pkg.go.dev/vuln/"
 )
 
-func GetGoIDFromFilename(filename string) string {
+// GoID returns the Go ID from the given filename, assuming the filename
+// is of the form "*/<goID>.<ext>".
+func GoID(filename string) string {
 	return strings.TrimSuffix(filepath.Base(filename), filepath.Ext(filename))
 }
 
-func GetGoAdvisoryLink(id string) string {
+func GoAdvisory(id string) string {
 	return fmt.Sprintf("%s%s", goURLPrefix, id)
 }
 
@@ -215,7 +217,7 @@
 	return r, nil
 }
 
-func (r *Report) GetYAMLFilename(goID string) string {
+func (r *Report) YAMLFilename(goID string) string {
 	dir := YAMLDir
 	if r.Excluded != "" {
 		dir = ExcludedDir
diff --git a/internal/report/report_test.go b/internal/report/report_test.go
index bacabb2..d988363 100644
--- a/internal/report/report_test.go
+++ b/internal/report/report_test.go
@@ -67,7 +67,7 @@
 		},
 	}
 	for _, test := range tests {
-		if got := test.r.GetYAMLFilename(test.goID); got != test.want {
+		if got := test.r.YAMLFilename(test.goID); got != test.want {
 			t.Errorf("got %s, want %s", got, test.want)
 		}
 	}
diff --git a/internal/report/reports.go b/internal/report/reports.go
index 3aafb47..bca50b2 100644
--- a/internal/report/reports.go
+++ b/internal/report/reports.go
@@ -25,8 +25,9 @@
 	ExcludedDir = "data/excluded"
 )
 
-func GetAllExisting(repo *git.Repository) (byIssue map[int]*Report, byFile map[string]*Report, err error) {
-	defer derrors.Wrap(&err, "GetAllExisting")
+// All returns all the reports in the repo, indexed by issue and by filename.
+func All(repo *git.Repository) (byIssue map[int]*Report, byFile map[string]*Report, err error) {
+	defer derrors.Wrap(&err, "All()")
 	root, err := gitrepo.Root(repo)
 	if err != nil {
 		return nil, nil, err
@@ -78,8 +79,8 @@
 	// matches is a map from filename -> alias/module
 	matches = make(map[string][]string)
 	for fname, rr := range existingByFile {
-		for _, alias := range rr.GetAliases() {
-			if slices.Contains(r.GetAliases(), alias) {
+		for _, alias := range rr.Aliases() {
+			if slices.Contains(r.Aliases(), alias) {
 				matches[fname] = append(matches[fname], alias)
 			}
 		}
@@ -117,7 +118,7 @@
 			return err
 		}
 
-		aliases = append(aliases, r.GetAliases()...)
+		aliases = append(aliases, r.Aliases()...)
 
 		return nil
 	}); err != nil {
diff --git a/internal/report/reports_test.go b/internal/report/reports_test.go
index 9ce38f1..5d14936 100644
--- a/internal/report/reports_test.go
+++ b/internal/report/reports_test.go
@@ -46,7 +46,7 @@
 	}
 )
 
-func TestGetAllExisting(t *testing.T) {
+func TestAll(t *testing.T) {
 
 	wantByIssue := map[int]*Report{1: &r1, 2: &r2, 4: &r4, 5: &r5}
 	wantByFile := map[string]*Report{
@@ -61,16 +61,16 @@
 		t.Fatal(err)
 	}
 
-	gotByIssue, gotByFile, err := GetAllExisting(repo)
+	gotByIssue, gotByFile, err := All(repo)
 	if err != nil {
-		t.Fatalf("GetAllExisting() error = %v, ", err)
+		t.Fatalf("All() error = %v, ", err)
 	}
 	if diff := cmp.Diff(gotByIssue, wantByIssue); diff != "" {
-		t.Errorf("GetAllExisting(): byIssue mismatch (-got, +want): %s", diff)
+		t.Errorf("All(): byIssue mismatch (-got, +want): %s", diff)
 	}
 
 	if diff := cmp.Diff(gotByFile, wantByFile); diff != "" {
-		t.Errorf("GetAllExisting() byFile mismatch (-got, +want): %s", diff)
+		t.Errorf("All() byFile mismatch (-got, +want): %s", diff)
 	}
 }
 
diff --git a/internal/report/testdata/repo.txtar b/internal/report/testdata/repo.txtar
index 778b9fb..2e4307c 100644
--- a/internal/report/testdata/repo.txtar
+++ b/internal/report/testdata/repo.txtar
@@ -1,7 +1,7 @@
 # Copyright 2022 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.
-Repo for testing reports.GetAllExisting, semi in the shape of
+Repo for testing reports.All(), semi in the shape of
 github.com/golang/vulndb
 
 -- data/reports/GO-9999-0001.yaml --
diff --git a/internal/worker/server.go b/internal/worker/server.go
index aabddde..9abeebd 100644
--- a/internal/worker/server.go
+++ b/internal/worker/server.go
@@ -356,7 +356,7 @@
 	if err != nil {
 		return err
 	}
-	_, allReports, err := report.GetAllExisting(repo)
+	_, allReports, err := report.All(repo)
 	if err != nil {
 		return err
 	}
