diff --git a/devtools/cmd/experiment/experiment.go b/devtools/cmd/experiment/experiment.go
deleted file mode 100644
index 58f85ec..0000000
--- a/devtools/cmd/experiment/experiment.go
+++ /dev/null
@@ -1,147 +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.
-
-// Command experiment is used for modifying data in the experiments table.
-package main
-
-import (
-	"context"
-	"flag"
-	"fmt"
-	"log"
-	"os"
-
-	"golang.org/x/pkgsite/internal"
-	"golang.org/x/pkgsite/internal/config"
-	"golang.org/x/pkgsite/internal/database"
-	"golang.org/x/pkgsite/internal/postgres"
-)
-
-const usage = `
-List experiments:
-    experiments [flags...] ls
-
-Create a new experiment:
-    experiments [flags...] create <name>
-
-Update an experiment:
-    experiments [flags...] update <name>
-
-Remove an experiment:
-    experiments [flags...] rm <name>
-`
-
-var rollout = flag.Uint("rollout", 100, "experiment rollout percentage")
-
-func exitUsage() {
-	flag.Usage()
-	os.Exit(2)
-}
-func main() {
-	flag.Usage = func() {
-		fmt.Fprint(flag.CommandLine.Output(), usage)
-		fmt.Fprintln(flag.CommandLine.Output())
-		fmt.Fprintln(flag.CommandLine.Output(), "Flags:")
-		flag.PrintDefaults()
-	}
-	flag.Parse()
-	if flag.NArg() < 1 {
-		exitUsage()
-	}
-	ctx := context.Background()
-	cfg, err := config.Init(ctx)
-	if err != nil {
-		log.Fatal(ctx, err)
-	}
-	cfg.Dump(os.Stderr)
-	ddb, err := database.Open("postgres", cfg.DBConnInfo(), cfg.InstanceID)
-	if err != nil {
-		log.Fatal(ctx, err)
-	}
-	defer ddb.Close()
-	db := postgres.New(ddb)
-	switch flag.Arg(0) {
-	case "ls", "list":
-		if err := listExperiments(ctx, db); err != nil {
-			log.Fatalf("listing experiments: %v", err)
-		}
-	case "create":
-		if flag.NArg() < 2 {
-			fmt.Println(flag.NArg())
-			exitUsage()
-		}
-		if err := createExperiment(ctx, db, flag.Arg(1), *rollout); err != nil {
-			log.Fatalf("creating experiment: %v", err)
-		}
-	case "update":
-		if flag.NArg() < 2 {
-			exitUsage()
-		}
-		if err := updateExperiment(ctx, db, flag.Arg(1), *rollout); err != nil {
-			log.Fatalf("updating experiment: %v", err)
-		}
-	case "rm", "remove":
-		if flag.NArg() < 1 {
-			exitUsage()
-		}
-		if err := removeExperiment(ctx, db, flag.Arg(1)); err != nil {
-			log.Fatalf("removing experiment: %v", err)
-		}
-	default:
-		exitUsage()
-	}
-}
-func listExperiments(ctx context.Context, db *postgres.DB) error {
-	exps, err := db.GetExperiments(ctx)
-	if err != nil {
-		return err
-	}
-	fmt.Printf("%30s %12s %-40s\n", "NAME", "ROLLOUT", "DESCRIPTION")
-	for _, exp := range exps {
-		fmt.Printf("%30s %12d %-40s\n", exp.Name, exp.Rollout, exp.Description)
-	}
-	return nil
-}
-
-func createExperiment(ctx context.Context, db *postgres.DB, name string, rollout uint) error {
-	exp := &internal.Experiment{
-		Name:        name,
-		Description: description(name),
-		Rollout:     rollout,
-	}
-	if err := db.InsertExperiment(ctx, exp); err != nil {
-		return err
-	}
-	fmt.Printf("\nCreated experiment %q with rollout=%d.\n", name, rollout)
-	return nil
-}
-
-func updateExperiment(ctx context.Context, db *postgres.DB, name string, rollout uint) error {
-	exp := &internal.Experiment{
-		Name:        name,
-		Description: description(name),
-		Rollout:     rollout,
-	}
-	if err := db.UpdateExperiment(ctx, exp); err != nil {
-		return err
-	}
-	fmt.Printf("\nUpdated experiment %q; rollout=%d.\n", name, rollout)
-	return nil
-}
-
-func removeExperiment(ctx context.Context, db *postgres.DB, name string) error {
-	if err := db.RemoveExperiment(ctx, name); err != nil {
-		return err
-	}
-	fmt.Printf("\nRemoved experiment %q.\n", name)
-	return nil
-}
-
-func description(name string) string {
-	d, ok := internal.Experiments[name]
-	if !ok {
-		log.Fatalf("Experiment %q does not exist.", name)
-	}
-	return d
-}
