diff --git a/cmd/frontend/main.go b/cmd/frontend/main.go
index 8e716dd..89468e4 100644
--- a/cmd/frontend/main.go
+++ b/cmd/frontend/main.go
@@ -6,13 +6,10 @@
 package main
 
 import (
-	"bufio"
 	"context"
 	"flag"
 	"net/http"
 	"os"
-	"strconv"
-	"strings"
 	"time"
 
 	"cloud.google.com/go/profiler"
@@ -67,7 +64,6 @@
 
 	var (
 		dsg        func(context.Context) internal.DataSource
-		expg       middleware.ExperimentGetter
 		fetchQueue queue.Queue
 	)
 	proxyClient, err := proxy.New(*proxyURL)
@@ -77,6 +73,7 @@
 	if *bypassLicenseCheck {
 		log.Info(ctx, "BYPASSING LICENSE CHECKING: DISPLAYING NON-REDISTRIBUTABLE INFORMATION")
 	}
+	expg := cmdconfig.ExperimentGetter(ctx, cfg)
 	if *directProxy {
 		var pds *proxydatasource.DataSource
 		if *bypassLicenseCheck {
@@ -85,8 +82,6 @@
 			pds = proxydatasource.New(proxyClient)
 		}
 		dsg = func(context.Context) internal.DataSource { return pds }
-		exps := readLocalExperiments(ctx)
-		expg = func(context.Context) ([]*internal.Experiment, error) { return exps, nil }
 	} else {
 		// Wrap the postgres driver with OpenCensus instrumentation.
 		ocDriver, err := ocsql.Register("postgres", ocsql.WithAllTraceOptions())
@@ -105,7 +100,6 @@
 		}
 		defer db.Close()
 		dsg = func(context.Context) internal.DataSource { return db }
-		expg = db.GetExperiments
 		sourceClient := source.NewClient(config.SourceTimeout)
 		// The closure passed to queue.New is only used for testing and local
 		// execution, not in production. So it's okay that it doesn't use a
@@ -221,51 +215,3 @@
 		cfg.DBHost, err, cfg.DBSecondaryHost)
 	return database.Open(driver, ci, cfg.InstanceID)
 }
-
-// Read a file of experiments used to initialize the local experiment source
-// for use in direct proxy mode.
-// Format of the file: each line is
-//     name,rollout
-// For each experiment.
-func readLocalExperiments(ctx context.Context) []*internal.Experiment {
-	filename := config.GetEnv("GO_DISCOVERY_LOCAL_EXPERIMENTS", "")
-	if filename == "" {
-		return nil
-	}
-	f, err := os.Open(filename)
-	if err != nil {
-		log.Fatal(ctx, err)
-	}
-	defer f.Close()
-	scan := bufio.NewScanner(f)
-	var experiments []*internal.Experiment
-	log.Infof(ctx, "reading experiments from %q for local development", filename)
-	for scan.Scan() {
-		line := strings.TrimSpace(scan.Text())
-		parts := strings.SplitN(line, ",", 3)
-		if len(parts) != 2 {
-			log.Fatalf(ctx, "invalid experiment in file: %q", line)
-		}
-		name := parts[0]
-		if name == "" {
-			log.Fatalf(ctx, "invalid experiment in file (name cannot be empty): %q", line)
-		}
-		rollout, err := strconv.ParseUint(parts[1], 10, 0)
-		if err != nil {
-			log.Fatalf(ctx, "invalid experiment in file (invalid rollout): %v", err)
-		}
-		if rollout > 100 {
-			log.Fatalf(ctx, "invalid experiment in file (rollout must be between 0 - 100): %q", line)
-		}
-		experiments = append(experiments, &internal.Experiment{
-			Name:    name,
-			Rollout: uint(rollout),
-		})
-		log.Infof(ctx, "experiment %q: rollout = %d", name, rollout)
-	}
-	if err := scan.Err(); err != nil {
-		log.Fatalf(ctx, "scanning %s: %v", filename, err)
-	}
-	log.Infof(ctx, "found %d experiment(s)", len(experiments))
-	return experiments
-}
diff --git a/cmd/internal/cmdconfig/cmdconfig.go b/cmd/internal/cmdconfig/cmdconfig.go
index 240add4..983e7b4 100644
--- a/cmd/internal/cmdconfig/cmdconfig.go
+++ b/cmd/internal/cmdconfig/cmdconfig.go
@@ -7,7 +7,8 @@
 
 import (
 	"context"
-	"os"
+	"fmt"
+	"strings"
 	"time"
 
 	"cloud.google.com/go/errorreporting"
@@ -49,25 +50,32 @@
 
 // Experimenter configures a middleware.Experimenter.
 func Experimenter(ctx context.Context, cfg *config.Config, getter middleware.ExperimentGetter, reportingClient *errorreporting.Client) *middleware.Experimenter {
-	if os.Getenv("GO_DISCOVERY_EXPERIMENTS_FROM_CONFIG") == "true" {
-		// Ignore getter, use dynamic config.
-		if cfg.DynamicConfigLocation == "" {
-			log.Warningf(ctx, "experiments are not configured")
-			getter = func(context.Context) ([]*internal.Experiment, error) { return nil, nil }
-		} else {
-			log.Infof(ctx, "using dynamic config from %s for experiments", cfg.DynamicConfigLocation)
-			getter = func(ctx context.Context) ([]*internal.Experiment, error) {
-				dc, err := dynconfig.Read(ctx, cfg.DynamicConfigLocation)
-				if err != nil {
-					return nil, err
-				}
-				return dc.Experiments, nil
-			}
-		}
-	}
 	e, err := middleware.NewExperimenter(ctx, 1*time.Minute, getter, reportingClient)
 	if err != nil {
 		log.Fatal(ctx, err)
 	}
 	return e
 }
+
+// ExperimentGetter returns an ExperimentGetter using the config.
+func ExperimentGetter(ctx context.Context, cfg *config.Config) middleware.ExperimentGetter {
+	if cfg.DynamicConfigLocation == "" {
+		log.Warningf(ctx, "experiments are not configured")
+		return func(context.Context) ([]*internal.Experiment, error) { return nil, nil }
+	}
+	log.Infof(ctx, "using dynamic config from %s for experiments", cfg.DynamicConfigLocation)
+	return func(ctx context.Context) ([]*internal.Experiment, error) {
+		dc, err := dynconfig.Read(ctx, cfg.DynamicConfigLocation)
+		if err != nil {
+			return nil, err
+		}
+
+		var s []string
+		for _, e := range dc.Experiments {
+			s = append(s, fmt.Sprintf("%s:%d", e.Name, e.Rollout))
+		}
+		log.Infof(ctx, "read experiments %s", strings.Join(s, ", "))
+
+		return dc.Experiments, nil
+	}
+}
diff --git a/cmd/worker/main.go b/cmd/worker/main.go
index 41ecfba..f914f79 100644
--- a/cmd/worker/main.go
+++ b/cmd/worker/main.go
@@ -94,7 +94,8 @@
 		log.Fatal(ctx, err)
 	}
 	sourceClient := source.NewClient(config.SourceTimeout)
-	fetchQueue, err := queue.New(ctx, cfg, queueName, *workers, db.GetExperiments,
+	expg := cmdconfig.ExperimentGetter(ctx, cfg)
+	fetchQueue, err := queue.New(ctx, cfg, queueName, *workers, expg,
 		func(ctx context.Context, modulePath, version string) (int, error) {
 			return worker.FetchAndUpdateState(ctx, modulePath, version, proxyClient, sourceClient, db, cfg.AppVersionLabel())
 		})
@@ -105,7 +106,7 @@
 	reportingClient := cmdconfig.ReportingClient(ctx, cfg)
 	redisHAClient := getHARedis(ctx, cfg)
 	redisCacheClient := getCacheRedis(ctx, cfg)
-	experimenter := cmdconfig.Experimenter(ctx, cfg, db.GetExperiments, reportingClient)
+	experimenter := cmdconfig.Experimenter(ctx, cfg, expg, reportingClient)
 	server, err := worker.NewServer(cfg, worker.ServerConfig{
 		DB:                   db,
 		IndexClient:          indexClient,
