diff --git a/build/ci/jenkins-presubmit.groovy b/build/ci/jenkins-presubmit.groovy
index b26cdd7..37278ba 100644
--- a/build/ci/jenkins-presubmit.groovy
+++ b/build/ci/jenkins-presubmit.groovy
@@ -45,7 +45,7 @@
                         gerritCheck checks: ['jenkins:gazelle': 'RUNNING'], message: "Running on ${env.NODE_NAME}"
                         echo "Gerrit change: ${GERRIT_CHANGE_URL}"
                         sh "git clean -fdx -e '/bazel-*'"
-                        sh "JENKINS_NODE_COOKIE=dontKillMe bazel run //:gazelle -- update-repos -from_file=go.mod -to_macro=third_party/go/repositories.bzl%go_repositories -prune"
+                        sh "JENKINS_NODE_COOKIE=dontKillMe bazel run //:gazelle-update-repos"
                         sh "JENKINS_NODE_COOKIE=dontKillMe bazel run //:gazelle -- update"
 
                         script {
@@ -56,7 +56,7 @@
                                     Unclean working directory after running gazelle.
                                     Please run:
 
-                                       \$ bazel run //:gazelle -- update-repos -from_file=go.mod -to_macro=third_party/go/repositories.bzl%go_repositories -prune
+                                       \$ bazel run //:gazelle-update-repos
                                        \$ bazel run //:gazelle -- update
 
                                     In your git checkout and amend the resulting diff to this changelist.
diff --git a/build/fietsje/BUILD.bazel b/build/fietsje/BUILD.bazel
deleted file mode 100644
index bb3c38e..0000000
--- a/build/fietsje/BUILD.bazel
+++ /dev/null
@@ -1,32 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-
-go_library(
-    name = "fietsje",
-    srcs = [
-        "dependency.go",
-        "deps_containerd.go",
-        "deps_delve.go",
-        "deps_gvisor.go",
-        "deps_kubernetes.go",
-        "deps_monogon.go",
-        "planner.go",
-        "render.go",
-        "shelf.go",
-        "transitive.go",
-    ],
-    importpath = "source.monogon.dev/build/fietsje",
-    visibility = ["//build:__subpackages__"],
-    deps = [
-        "//build/fietsje/proto",
-        "@bazel_gazelle//label:go_default_library",
-        "@com_github_golang_protobuf//proto:go_default_library",
-        "@org_golang_x_mod//modfile",
-    ],
-)
-
-exports_files(
-    [
-        "fietsje.bash.in",
-    ],
-    visibility = ["//visibility:public"],
-)
diff --git a/build/fietsje/README.md b/build/fietsje/README.md
deleted file mode 100644
index 723813f..0000000
--- a/build/fietsje/README.md
+++ /dev/null
@@ -1,169 +0,0 @@
-Fietsje
-=======
-
-The little Gazelle that could.
-
-Introduction
-------------
-
-Fietsje is a dependency management system for Go dependencies in monogon. It
-does not replace either gomods or Gazelle, but instead builds upon both on them
-in a way that makes sense for our particular usecase: pulling in a large set of
-dependency trees from third\_party projects, and sticking to those as much as
-possible.
-
-When run, Fietsje consults rules written themselves in Go (in `deps_.*go`
-files), and uses this high-level intent to write a `repositories.bzl` file
-that is then consumed by Gazelle. It caches 'locked' versions (ie. Go import
-path and version to a particular checksum) in the Shelf, a text proto file
-that lives alongside `repositories.bzl`. The Shelf should not be modified
-manually.
-
-The effective source of truth used for builds is still the `repositories.bzl`
-file in the actual build path. Definitions in Go are in turn the high-level
-intent that is used to build `repositories.bzl`.
-
-Running
--------
-
-You should run Fietsje any time you want to update dependencies. The following
-should be a no-op if you haven't changed anything in `deps_*.go`:
-
-    scripts/bin/bazel run //:fietsje
-
-Otherwise, if any definition in build/fietsje/deps_*.go has been changed,
-third_party/go/repositories.bzl will now reflect that.
-
-Fietsje Definition DSL (collect/use/...)
-----------------------------------------
-
-Definitions are kept in pure Go source, with a light DSL focused around a
-'planner' builder.
-
-The builder allows for two kinds of actions:
- - import a high level dependency (eg. Kubernetes, google/tpm) at a particular
-   version. This is done using the `collect()` call. The dependency will now
-   be part of the build, but its transitive dependencies will not. A special
-   flavor of collect() is collectOverride(), that explicitely allows for
-   overriding a dependency that has already been pulled in by another high
-   level dependency.
- - enable a transitive dependency defined by a high-level definition using the `use()`
-   call. This can only be done in a `collection` builder context, ie. after a
-   `collect()`/`collectOverride()`call.
-   
-In addition, the builder allows to augment a `collection` context with build flags
-(like enabled patches, build tags, etc) that will be applied to the next `.use()`
-call only. This is done by calling `.with()`.
-
-In general, `.collect()`/`.collectOverride()` calls should be limited only to
-dependencies 'we' (as developers) want. These 'high-level' dependencies are
-large projects like Kubernetes, or direct imports from monogon itself. Every
-transitive dependency of those should just be enabled by calling `.use()`,
-instead of another `.collectOverride()` call that might pin it to a wrong
-version.
-
-After updating definitions, run Fietsje as above.
-
-How to: add a new high-level dependency
----------------------------------------
-
-To add a new high-level dependency, first consider making a new `deps_*.go`
-file for it. If you're pulling in a separate ecosystem of code (ie. a large
-third-party project like kubernetes), it should live in its own file for
-clarity. If you're just pulling in a simple dependency (eg. a library low on
-transitive dependencies) you can drop it into `main.go`.
-
-The first step is to pick a version of the dependency you want to use. If
-possible, pick a tag/release. Otherwise, pick the current master commit hash.
-You can find version information by visiting the project's git repository web
-viewer, or first cloning the repository locally.
-
-Once you've picked a version, add a line like this:
-
-    p.collect("github.com/example/foo", "1.2.3")
-
-If you now re-run Fietsje and rebuild your code, it should be able to link
-against the dependency directly. If this works, you're done. If not, you will
-start getting errors about the newly included library trying to link against
-missing dependencies (ie. external Bazel workspaces). This means you need to
-enable these transitive dependencies for the high-level dependency you've just
-included.
-
-If your high-level dependency contains a go.mod/go.sum file, you can call
-`.use` on the return of the `collect()` call to enable them. Only enable the
-ones that are necessary to build your code. In the future, audit flows might be
-implemented to find and eradicate unused transitive dependencies, while enabling
-ones that are needed - but for now this has to be done manually - usually by a
-cycle of:
-
- - try to build your code
- - find missing transitive library, enable via .use()
- - repeat until code builds
-
-With our previous example, enabling transitive dependencies would look something
-like this:
-
-    p.collect(
-        "github.com/example/foo", "1.2.3",
-    ).use(
-        "github.com/example/libbar",
-        "github.com/example/libbaz",
-        "github.com/golang/glog",
-    )
-
-What this means is that github.com/{example/libbar,example/libbaz,golang/glog}
-will now be available to the build at whatever version example/foo defines them
-in its go.mod/go.sum.
-
-If your high-level dependency is not go.mod/go.sum compatible, you have
-different ways to proceed:
-
- - if the project uses some alternative resolution/vendoring code, write
-   support for it in transitive.go/`getTransitiveDeps`
- - otherwise, if you're not in a rush, try to convince and/or send a PR to
-   upstream to enable Go module support
- - if the dependency has little transitive dependencies, use `.inject()` to
-   add transitive dependencies manually after your `.collect()` call
- - otherwise, extend fietsje to allow for out-of-tree go.mod/go.sum files kept
-   within monogon, or come up with some other solution.
-
-Your new dependency might conflict with existing dependencies, which usually
-manifests in build failures due to incompatible types. If this happens, you
-will have to start digging to find a way to bring in compatible versions of
-the two dependencies that are interacting with eachother. Do also mention any
-such constraints in code comments near your `.collect()` call.
-
-How to: update a high-level dependency
---------------------------------------
-
-If you want to update a .collect()/.collectOverride() call, find out the
-version you want to bump to and update it in the call. Re-running fietsje
-will automatically update all enable transitive dependencies. Build and test
-your code. Again, any possible conflicts will have to be resolved manually.
-
-In the future, an audit flow might be provided for checking what the newest
-available version of a high-level dependency is, to allow for easier,
-semi-automated version bumps.
-
-Version resolution conflicts
-----------------------------
-
-Any time a `.collect()`/`.collectOverride()` call is made, Fietsje will note
-what transitive dependencies did the specified high-level dependency request.
-Then, subsequent `.use()` calls will enable these dependencies in the build. On
-subsequent `.collect()`/`.collectOverride()` calls, any transitive dependency
-that already has been pulled in will be ignored, and the existing version will
-be kept.
-
-This means that Fietsje does not detect or handle version conflicts at a granular
-level comparable to gomod. However, it does perform 'well enough', and in general
-the Go ecosystem is stable enough that incompatibilites arise rarely - especially as
-everything moves forward to versioned to go modules, which allow for multiple
-incompatible versions to coexist as fully separate import paths.
-
-It is as such the programmer's job to understand the relationship between imported
-high-level dependencies. In the future, helper heuristics can be included that will
-help understand and reason about dependency relationships. For now, Fietsje will just
-help a user when they call `.use()` on the wrong dependency, ie. when the requested
-transitive dependency has not been pulled in by a given high-level dependency.
-
diff --git a/build/fietsje/cmd/BUILD.bazel b/build/fietsje/cmd/BUILD.bazel
deleted file mode 100644
index fec62fe..0000000
--- a/build/fietsje/cmd/BUILD.bazel
+++ /dev/null
@@ -1,19 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
-
-go_library(
-    name = "cmd_lib",
-    srcs = ["main.go"],
-    importpath = "source.monogon.dev/build/fietsje/cmd",
-    visibility = ["//visibility:private"],
-    deps = [
-        "//build/fietsje",
-        "//build/toolbase",
-        "//build/toolbase/gotoolchain",
-    ],
-)
-
-go_binary(
-    name = "cmd",
-    embed = [":cmd_lib"],
-    visibility = ["//visibility:public"],
-)
diff --git a/build/fietsje/cmd/main.go b/build/fietsje/cmd/main.go
deleted file mode 100644
index b9e1553..0000000
--- a/build/fietsje/cmd/main.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// fietsje is the standalone command line tool which calls into the Fietsje
-// library (//build/fietsje) to perform actual work. The split between cli and
-// main library is used so that Fietsje can be called from other Go tooling
-// without having to shell out to a binary.
-package main
-
-import (
-	"log"
-	"os"
-	"path"
-
-	"source.monogon.dev/build/fietsje"
-	"source.monogon.dev/build/toolbase"
-	"source.monogon.dev/build/toolbase/gotoolchain"
-)
-
-func main() {
-	// Get absolute path of Monogon workspace directory currently operating on
-	// (either via bazel run or by running it directly in the root of a checkout),
-	// use it to build paths to shelf.pb.txt and repositories.bzl.
-	wd, err := toolbase.WorkspaceDirectory()
-	if err != nil {
-		log.Fatalf("%v", err)
-	}
-	shelfPath := path.Join(wd, "third_party/go/shelf.pb.text")
-	repositoriesBzlPath := path.Join(wd, "third_party/go/repositories.bzl")
-	// Set GOROOT as required by fietsje/go-the-tool.
-	os.Setenv("GOROOT", gotoolchain.Root)
-
-	if err := fietsje.Monogon(shelfPath, repositoriesBzlPath); err != nil {
-		log.Fatal(err)
-	}
-}
diff --git a/build/fietsje/dependency.go b/build/fietsje/dependency.go
deleted file mode 100644
index 1eeb52c..0000000
--- a/build/fietsje/dependency.go
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package fietsje
-
-import (
-	"encoding/json"
-	"fmt"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-
-	"github.com/bazelbuild/bazel-gazelle/label"
-)
-
-// dependency is an external Go package/module, requested by the user of Fietsje
-// directly or indirectly.
-type dependency struct {
-	// importpath is the Go import path that was used to import this dependency.
-	importpath string
-	// version at which this dependency has been requested. This can be in any form
-	// that `go get` or the go module system understands.
-	version string
-
-	// locked is the 'resolved' version of a dependency, containing information about
-	// the dependency's hash, etc.
-	locked *locked
-
-	// parent is the dependency that pulled in this one, or nil if pulled in by the
-	// user.
-	parent *dependency
-
-	shelf *shelf
-
-	// Build specific settings passed to gazelle.
-	disableProtoBuild    bool
-	forceBazelGeneration bool
-	buildTags            []string
-	patches              []string
-	prePatches           []string
-	buildExtraArgs       []string
-	useImportAliasNaming bool
-	// replace is an importpath that this dependency will replace. If this is set, this
-	// dependency will be visible in the build as 'importpath', but downloaded at
-	// 'replace'/'version'. This might be slighly confusing, but follows the semantics
-	// of what Gazelle exposes via 'replace' in 'go_repository'.
-	replace string
-}
-
-func (d *dependency) remoteImportpath() string {
-	if d.replace != "" {
-		return d.replace
-	}
-	return d.importpath
-}
-
-// locked is information about a dependency resolved from the go module system. It
-// is expensive to get, and as such it is cached both in memory (as .locked in a
-// dependency) and in the shelf.
-type locked struct {
-	// bazelName is the external workspace name that Bazel should use for this
-	// dependency, eg. com_github_google_glog.
-	bazelName string
-	// sum is the gomod compatible checksum of the depdendency,
-	// egh1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=.
-	sum string
-	// semver is the gomod-compatible version of this dependency. If the dependency was
-	// requested by git hash that does not resolve to a particular release, this will
-	// be in the form of v0.0.0-20200520133742-deadbeefcafe.
-	semver string
-}
-
-// child creates a new child dependence for this dependency, ie. one where the
-// 'parent' pointer points to the dependency on which this method is called.
-func (d *dependency) child(importpath, version string) *dependency {
-	return &dependency{
-		importpath: importpath,
-		version:    version,
-		shelf:      d.shelf,
-		parent:     d,
-	}
-}
-
-func (d *dependency) String() string {
-	if d.replace != "" {
-		return fmt.Sprintf("%s@%s (replacing %s)", d.replace, d.version, d.importpath)
-	}
-	return fmt.Sprintf("%s@%s", d.importpath, d.version)
-}
-
-// lock ensures that this dependency is locked, which means that it has been
-// resolved to a particular, stable version and VCS details. We lock a dependency
-// by either asking the go module subsystem (via a go module proxy or a download),
-// or by consulting the shelf as a cache.
-func (d *dependency) lock() error {
-	// If already locked in-memory, use that.
-	if d.locked != nil {
-		return nil
-	}
-
-	// If already locked in the shelf, use that.
-	if shelved := d.shelf.get(d.remoteImportpath(), d.version); shelved != nil {
-		d.locked = shelved
-		return nil
-	}
-
-	// Otherwise, download module.
-	semver, _, sum, err := d.download()
-	if err != nil {
-		return fmt.Errorf("could not download: %v", err)
-	}
-
-	// And resolve its bazelName.
-	name := label.ImportPathToBazelRepoName(d.importpath)
-
-	d.locked = &locked{
-		bazelName: name,
-		sum:       sum,
-		semver:    semver,
-	}
-	log.Printf("%s: locked to %s", d, d.locked)
-
-	// Save locked version to shelf.
-	d.shelf.put(d.remoteImportpath(), d.version, d.locked)
-	return d.shelf.save()
-}
-
-func (l *locked) String() string {
-	return fmt.Sprintf("%s@%s", l.bazelName, l.sum)
-}
-
-// download ensures that this dependency is download locally, and returns the
-// download location and the dependency's gomod-compatible sum.
-func (d *dependency) download() (version, dir, sum string, err error) {
-	goroot := os.Getenv("GOROOT")
-	if goroot == "" {
-		err = fmt.Errorf("GOROOT must be set")
-		return
-	}
-	goTool := filepath.Join(goroot, "bin", "go")
-
-	query := fmt.Sprintf("%s@%s", d.remoteImportpath(), d.version)
-	cmd := exec.Command(goTool, "mod", "download", "-json", "--", query)
-	out, err := cmd.Output()
-	if err != nil {
-		log.Printf("go mod returned: %q", out)
-		err = fmt.Errorf("go mod failed: %v", err)
-		return
-	}
-
-	var res struct{ Version, Sum, Dir string }
-	err = json.Unmarshal(out, &res)
-	if err != nil {
-		return
-	}
-
-	version = res.Version
-	dir = res.Dir
-	sum = res.Sum
-	return
-}
diff --git a/build/fietsje/deps_containerd.go b/build/fietsje/deps_containerd.go
deleted file mode 100644
index 9461cdb..0000000
--- a/build/fietsje/deps_containerd.go
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package fietsje
-
-// deps_containerd.go contains all dependencies required by containerd/runc.
-
-func depsContainerd(p *planner) {
-	p.collectOverride(
-		"github.com/containerd/containerd", "v1.4.3",
-		buildTags("no_zfs", "no_aufs", "no_devicemapper", "no_btrfs"),
-		disabledProtoBuild,
-	).use(
-		"github.com/BurntSushi/toml",
-		"github.com/Microsoft/go-winio",
-		"github.com/beorn7/perks",
-		"github.com/cespare/xxhash/v2",
-		"github.com/cilium/ebpf",
-		"github.com/containerd/btrfs",
-		"github.com/containerd/console",
-		"github.com/containerd/continuity",
-		"github.com/containerd/fifo",
-		"github.com/containerd/go-cni",
-		"github.com/containerd/go-runc",
-		"github.com/containerd/imgcrypt",
-		"github.com/containers/ocicrypt",
-		"github.com/containerd/typeurl",
-		"github.com/coreos/go-systemd/v22",
-		"github.com/cpuguy83/go-md2man/v2",
-		"github.com/davecgh/go-spew",
-		"github.com/docker/docker",
-		"github.com/docker/go-events",
-		"github.com/docker/go-metrics",
-		"github.com/docker/go-units",
-		"github.com/docker/spdystream",
-		"github.com/emicklei/go-restful",
-		"github.com/fullsailor/pkcs7",
-		"github.com/godbus/dbus/v5",
-		"github.com/gogo/protobuf",
-		"github.com/go-logr/logr",
-		"github.com/google/gofuzz",
-		"github.com/google/uuid",
-		"github.com/hashicorp/errwrap",
-		"github.com/hashicorp/go-multierror",
-		"github.com/hashicorp/golang-lru",
-		"github.com/imdario/mergo",
-		"github.com/json-iterator/go",
-		"github.com/konsorten/go-windows-terminal-sequences",
-		"github.com/matttproud/golang_protobuf_extensions",
-		"github.com/modern-go/concurrent",
-		"github.com/modern-go/reflect2",
-		"github.com/opencontainers/go-digest",
-		"github.com/opencontainers/image-spec",
-		"github.com/opencontainers/runc",
-		"github.com/opencontainers/runtime-spec",
-		"github.com/pkg/errors",
-		"github.com/prometheus/client_golang",
-		"github.com/prometheus/client_model",
-		"github.com/prometheus/common",
-		"github.com/prometheus/procfs",
-		"github.com/russross/blackfriday/v2",
-		"github.com/shurcooL/sanitized_anchor_name",
-		"github.com/sirupsen/logrus",
-		"github.com/syndtr/gocapability",
-		"github.com/tchap/go-patricia",
-		"github.com/urfave/cli",
-		"go.etcd.io/bbolt",
-		"go.opencensus.io",
-		"golang.org/x/crypto",
-		"golang.org/x/oauth2",
-		"google.golang.org/genproto",
-		"gopkg.in/inf.v0",
-		"gopkg.in/yaml.v2",
-		"k8s.io/klog/v2",
-		"sigs.k8s.io/yaml",
-	).with(useImportAliasNaming).use(
-		"golang.org/x/sync",
-	).with(disabledProtoBuild, patches("containerd-netns-statedir.patch")).use(
-		"github.com/containerd/cri",
-	).with(disabledProtoBuild).use(
-		"github.com/Microsoft/hcsshim",
-		"github.com/containerd/cgroups",
-
-		"github.com/gogo/googleapis",
-	).with(buildTags("selinux")).use(
-		"github.com/opencontainers/selinux",
-		"github.com/willf/bitset",
-	).with(patches(
-		"ttrpc-hacks.patch",
-	)).use(
-		"github.com/containerd/ttrpc",
-	).with(patches(
-		"cni-fix-cachepath.patch",
-	)).use("github.com/containernetworking/cni").replace(
-		// ttrpc is broken by go protobuf v2, this is a tentative PR that's
-		// not yet merged by upstream.
-		// See: https://github.com/containerd/ttrpc/pull/67
-		//
-		// It also contains our own fix that builds up on the above and allows services to
-		// return the original status error library values. This is required for ttrpc to
-		// actually work from runsc and for results to be correctly interpreted by
-		// containerd. See:
-		//   https://github.com/monogon-dev/ttrpc/commit/222b428f008e3ecb11cfff12e3fd92e3143a2f01
-		//
-		// Note: this is not a good fix, and has known issues, like not being
-		// able to return Details in gRPC status errors. However, with the
-		// limited usage within gvisor/containerd it works. In the future
-		// upstream will have to resolve this properly, eg. port ttrpc away
-		// from gogo, or fix gogo to work with the new protobuf APU.
-		"github.com/containerd/ttrpc",
-		"github.com/monogon-dev/ttrpc", "222b428f008e3ecb11cfff12e3fd92e3143a2f01",
-	)
-
-	// This is depended on by github.com/containerd/containerd, but not mentioned in
-	// their vendor.conf. They seem to be moving off of vendoring to gomod, so this
-	// should be reverted on the next containerd bump (when fietsje will panic about
-	// vendor.conf missing).
-	p.collectOverride(
-		"github.com/checkpoint-restore/go-criu/v4", "v4.1.0",
-	)
-
-	// containernetworking/plugins
-	p.collectOverride(
-		"github.com/containernetworking/plugins", "v0.8.2",
-	).use(
-		"github.com/alexflint/go-filemutex",
-		"github.com/coreos/go-iptables",
-		"github.com/j-keck/arping",
-		"github.com/safchain/ethtool",
-	)
-}
diff --git a/build/fietsje/deps_delve.go b/build/fietsje/deps_delve.go
deleted file mode 100644
index 69258a8..0000000
--- a/build/fietsje/deps_delve.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package fietsje
-
-// deps_delve.go contains all dependencies required by the Delve debugger.
-
-func depsDelve(p *planner) {
-	p.collect("github.com/go-delve/delve", "v1.4.1").use(
-		"github.com/google/go-dap",
-		"github.com/peterh/liner",
-		"github.com/cosiner/argv",
-		"golang.org/x/arch",
-		"go.starlark.net",
-	)
-}
diff --git a/build/fietsje/deps_gvisor.go b/build/fietsje/deps_gvisor.go
deleted file mode 100644
index 8810a83..0000000
--- a/build/fietsje/deps_gvisor.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package fietsje
-
-// deps_gvisor.go contains all dependencies required by gVisor/runsc.
-
-func depsGVisor(p *planner) {
-	p.collect(
-		"github.com/google/gvisor", "release-20211101.0",
-		patches(
-			"gvisor.patch",
-			"gvisor-build-against-newer-runtime-specs.patch",
-			"gvisor-cgroup-fix.patch",
-		),
-	).use(
-		"github.com/cenkalti/backoff",
-		"github.com/gofrs/flock",
-		"github.com/google/subcommands",
-		"github.com/kr/pretty",
-		"github.com/kr/pty",
-		"github.com/mohae/deepcopy",
-		"golang.org/x/time",
-	)
-	// gRPC is used by gvisor's bazel machinery, but not present in go.sum. Include it
-	// manually.
-	p.collect("github.com/grpc/grpc", "v1.29.1")
-}
diff --git a/build/fietsje/deps_kubernetes.go b/build/fietsje/deps_kubernetes.go
deleted file mode 100644
index e3b00cf..0000000
--- a/build/fietsje/deps_kubernetes.go
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package fietsje
-
-// deps_kubernetes.go contains all dependencies required by Kubernetes.
-
-func depsKubernetes(p *planner) {
-	// containerd and its deps
-	p.collect(
-		"k8s.io/kubernetes", "v1.19.7",
-		buildTags("providerless"),
-		disabledProtoBuild,
-		patches(
-			"k8s-kubernetes.patch",
-			"k8s-kubernetes-build.patch",
-			"k8s-native-metrics.patch",
-			"k8s-use-native.patch",
-			"k8s-revert-seccomp-runtime-default.patch",
-			"k8s-removed-block-device-pseudo-locks.patch",
-		),
-		prePatches(
-			"k8s-e2e-tests-providerless.patch",
-			"k8s-fix-paths.patch",
-			"k8s-fix-logs-path.patch",
-			"k8s-drop-legacy-log-path.patch",
-		),
-	).inject(
-		// repo infra, not requested by k8s, but used with bazel
-		"k8s.io/repo-infra", "a3483874bd37251c629c92df6d82a226b0e6ad92",
-		prePatches("k8s-infra-bzl4-compat.patch", "k8s-infra-fix-go116.patch"),
-	).with(prePatches("k8s-client-go.patch")).use(
-		"k8s.io/client-go",
-	).with(patches("k8s-native-mounter.patch")).use(
-		"k8s.io/utils",
-	).use(
-		"k8s.io/cli-runtime",
-		"k8s.io/client-go",
-		"k8s.io/cloud-provider",
-		"k8s.io/cluster-bootstrap",
-		"k8s.io/code-generator",
-		"k8s.io/component-base",
-		"k8s.io/csi-translation-lib",
-		"k8s.io/kube-controller-manager",
-		"k8s.io/kube-proxy",
-		"k8s.io/kube-scheduler",
-		"k8s.io/kubectl",
-		"k8s.io/legacy-cloud-providers",
-		"k8s.io/sample-apiserver",
-	).with(disabledProtoBuild).use(
-		"k8s.io/api",
-		"k8s.io/apiextensions-apiserver",
-		"k8s.io/apimachinery",
-		"k8s.io/apiserver",
-		"k8s.io/cri-api",
-		"k8s.io/kube-aggregator",
-		"k8s.io/kubelet",
-		"k8s.io/metrics",
-	).use(
-		"cloud.google.com/go",
-		"github.com/Azure/go-ansiterm",
-		"github.com/MakeNowJust/heredoc",
-		"github.com/NYTimes/gziphandler",
-		"github.com/PuerkitoBio/purell",
-		"github.com/PuerkitoBio/urlesc",
-		"github.com/armon/circbuf",
-		"github.com/asaskevich/govalidator",
-		"github.com/bgentry/speakeasy",
-		"github.com/blang/semver",
-		"github.com/chai2010/gettext-go",
-		"github.com/container-storage-interface/spec",
-		"github.com/coreos/go-oidc",
-		"github.com/coreos/go-semver",
-		"github.com/coreos/go-systemd",
-		"github.com/coreos/pkg",
-		"github.com/cyphar/filepath-securejoin",
-		"github.com/daviddengcn/go-colortext",
-		"github.com/dgrijalva/jwt-go",
-		"github.com/docker/go-connections",
-		"github.com/docker/distribution",
-		"github.com/dustin/go-humanize",
-		"github.com/elazarl/goproxy",
-		"github.com/euank/go-kmsg-parser",
-		"github.com/evanphx/json-patch",
-		"github.com/exponent-io/jsonpath",
-		"github.com/fatih/camelcase",
-		"github.com/fatih/color",
-		"github.com/ghodss/yaml",
-		"github.com/go-openapi/analysis",
-		"github.com/go-openapi/errors",
-		"github.com/go-openapi/jsonpointer",
-		"github.com/go-openapi/jsonreference",
-		"github.com/go-openapi/loads",
-		"github.com/go-openapi/runtime",
-		"github.com/go-openapi/spec",
-		"github.com/go-openapi/strfmt",
-		"github.com/go-openapi/swag",
-		"github.com/go-openapi/validate",
-		"github.com/go-stack/stack",
-		"github.com/golang/groupcache",
-		"github.com/google/btree",
-		"github.com/google/go-cmp",
-		"github.com/gorilla/websocket",
-		"github.com/gregjones/httpcache",
-		"github.com/grpc-ecosystem/go-grpc-middleware",
-		"github.com/grpc-ecosystem/go-grpc-prometheus",
-		"github.com/grpc-ecosystem/grpc-gateway",
-		"github.com/hashicorp/hcl",
-		"github.com/hpcloud/tail",
-		"github.com/inconshreveable/mousetrap",
-		"github.com/jonboulle/clockwork",
-		"github.com/karrick/godirwalk",
-		"github.com/liggitt/tabwriter",
-		"github.com/lithammer/dedent",
-		"github.com/mailru/easyjson",
-		"github.com/magiconair/properties",
-		"github.com/mattn/go-colorable",
-		"github.com/mattn/go-isatty",
-		"github.com/mattn/go-runewidth",
-		"github.com/mindprince/gonvml",
-		"github.com/mistifyio/go-zfs",
-		"github.com/mitchellh/go-wordwrap",
-		"github.com/mitchellh/mapstructure",
-		"github.com/moby/term",
-		"github.com/moby/sys/mountinfo",
-		"github.com/morikuni/aec",
-		"github.com/mrunalp/fileutils",
-		"github.com/munnerz/goautoneg",
-		"github.com/mxk/go-flowrate",
-		"github.com/olekukonko/tablewriter",
-		"github.com/onsi/ginkgo",
-		"github.com/onsi/gomega",
-		"github.com/peterbourgon/diskv",
-		"github.com/pquerna/cachecontrol",
-		"github.com/robfig/cron",
-		"github.com/russross/blackfriday",
-		"github.com/soheilhy/cmux",
-		"github.com/spf13/afero",
-		"github.com/spf13/cast",
-		"github.com/spf13/jwalterweatherman",
-		"github.com/spf13/cobra",
-		"github.com/spf13/pflag",
-		"github.com/spf13/viper",
-		"github.com/stretchr/testify",
-		"github.com/tmc/grpc-websocket-proxy",
-		"github.com/vishvananda/netlink",
-		"github.com/vishvananda/netns",
-		"github.com/xiang90/probing",
-		"go.mongodb.org/mongo-driver",
-		"go.uber.org/atomic",
-		"go.uber.org/multierr",
-		"go.uber.org/zap",
-		"golang.org/x/net",
-		"golang.org/x/xerrors",
-		"gonum.org/v1/gonum",
-		"gopkg.in/fsnotify.v1",
-		"gopkg.in/natefinch/lumberjack.v2",
-		"gopkg.in/square/go-jose.v2",
-		"gopkg.in/tomb.v1",
-		"k8s.io/gengo",
-		"k8s.io/heapster",
-		"k8s.io/kube-openapi",
-		"sigs.k8s.io/apiserver-network-proxy/konnectivity-client",
-		"sigs.k8s.io/kustomize",
-		"sigs.k8s.io/structured-merge-diff/v4",
-		"vbom.ml/util",
-	).use(
-		"github.com/google/cadvisor",
-	).with(disabledProtoBuild).use(
-		"go.etcd.io/etcd",
-		"github.com/googleapis/gnostic",
-	)
-}
diff --git a/build/fietsje/deps_monogon.go b/build/fietsje/deps_monogon.go
deleted file mode 100644
index 7ab3705..0000000
--- a/build/fietsje/deps_monogon.go
+++ /dev/null
@@ -1,152 +0,0 @@
-package fietsje
-
-// deps_monogon.go contains the main entrypoint for Monogon-specific
-// dependencies to be handled by fietsje, and calls out to all other functions
-// in deps_*.go.
-
-import (
-	"bytes"
-	"fmt"
-	"os"
-)
-
-// Monogon runs fietsje for all Monogon transitive dependencies.
-func Monogon(shelfPath, repositoriesBzlPath string) error {
-	shelf, err := shelfLoad(shelfPath)
-	if err != nil {
-		return fmt.Errorf("could not load shelf: %w", err)
-	}
-
-	p := &planner{
-		available: make(map[string]*dependency),
-		enabled:   make(map[string]bool),
-		seen:      make(map[string]string),
-
-		shelf: shelf,
-	}
-
-	depsKubernetes(p)
-	depsContainerd(p)
-	depsGVisor(p)
-
-	// our own deps, common
-	p.collectOverride("go.uber.org/zap", "v1.15.0")
-	p.collectOverride("golang.org/x/mod", "v0.3.0", useImportAliasNaming)
-	p.collectOverride("github.com/spf13/viper", "v1.9.0").use(
-		"gopkg.in/ini.v1",
-		"github.com/subosito/gotenv",
-	)
-	p.collectOverride("github.com/spf13/cobra", "v1.2.1")
-	p.collect("github.com/cenkalti/backoff/v4", "v4.0.2")
-
-	p.collect("github.com/google/go-tpm", "ae6dd98980d4")
-	p.collect("github.com/google/go-tpm-tools", "f8c04ff88181")
-	p.collect("github.com/google/certificate-transparency-go", "v1.1.0")
-	p.collect("github.com/insomniacslk/dhcp", "67c425063dcad32c5d14ce9a520c8865240dc945").use(
-		"github.com/mdlayher/ethernet",
-		"github.com/mdlayher/raw",
-		"github.com/u-root/u-root",
-	)
-	p.collect("github.com/rekby/gpt", "a930afbc6edcc89c83d39b79e52025698156178d")
-	p.collect("github.com/yalue/native_endian", "51013b03be4fd97b0aabf29a6923e60359294186")
-
-	// Used by //build/bazel_cc_fix, override to make sure we use the latest version
-	p.collectOverride("github.com/mattn/go-shellwords", "v1.0.11")
-
-	// Used by //metropolis/build/mkimage
-	p.collect("github.com/diskfs/go-diskfs", "v1.2.0").use(
-		"gopkg.in/djherbis/times.v1",
-		"github.com/pkg/xattr",
-		"github.com/pierrec/lz4",
-		"github.com/ulikunitz/xz",
-	)
-
-	p.collect("github.com/pierrec/lz4/v4", "v4.1.12")
-
-	// Used by //metropolis/build/genosrelease
-	p.collect("github.com/joho/godotenv", "v1.3.0")
-
-	// used by //build/bindata
-	p.collect("github.com/kevinburke/go-bindata", "v3.16.0")
-
-	// for interactive debugging during development (//:dlv alias)
-	depsDelve(p)
-
-	// Used by //metropolis/test/nanoswitch
-	p.collect("github.com/google/nftables", "7127d9d22474b437f0e8136ddb21855df29790bf").use(
-		"github.com/koneu/natend",
-	)
-
-	// Used by //metropolis/node/core/network/dhcp4c
-	p.collect("github.com/google/gopacket", "v1.1.17")
-
-	// used by //core//kubernetes/clusternet
-	p.collect("golang.zx2c4.com/wireguard/wgctrl", "ec7f26be9d9e47a32a2789f8c346031978485cbf").use(
-		"github.com/mdlayher/netlink",
-		"github.com/mdlayher/genetlink",
-	)
-
-	p.collect(
-		"github.com/sbezverk/nfproxy", "7fac5f39824e7f34228b08ba8b7640770ca6a9f4",
-		patches("nfproxy.patch"),
-	).use(
-		"github.com/sbezverk/nftableslib",
-	)
-
-	p.collect("github.com/coredns/coredns", "v1.7.0",
-		prePatches("coredns-remove-unused-plugins.patch"),
-	).use(
-		"github.com/caddyserver/caddy",
-		"github.com/dnstap/golang-dnstap",
-		"github.com/farsightsec/golang-framestream",
-		"github.com/flynn/go-shlex",
-		"github.com/grpc-ecosystem/grpc-opentracing",
-		"github.com/infobloxopen/go-trees",
-		"github.com/miekg/dns",
-		"github.com/opentracing/opentracing-go",
-	)
-
-	// goimports with import grouping patch
-	// https://go-review.googlesource.com/c/tools/+/321409/
-	p.collectOverride("golang.org/x/tools", "v0.1.2-0.20210518182153-17b346669257", patches("goimports-group-merging.patch"))
-
-	// commentwrap is used as a nogo analyzer to stick to a maximum line
-	// length for comments.
-	p.collect("github.com/corverroos/commentwrap", "2926638be44ce0c6c0ee2471e9b5ad9473c984cd").use(
-		"github.com/muesli/reflow",
-	)
-
-	// Used by metroctl to resolve XDG directories
-	p.collect("github.com/adrg/xdg", "v0.4.0")
-
-	// Used for generating proto docs in //build/proto_docs
-	p.collect("github.com/pseudomuto/protoc-gen-doc", "v1.5.0", patches("protoc-gen-doc-no-gogo.patch")).use(
-		"github.com/Masterminds/sprig",
-		"github.com/Masterminds/semver",
-		"github.com/aokoli/goutils",
-		"github.com/huandu/xstrings",
-	).with(
-		disabledProtoBuild,
-	).use(
-		"github.com/pseudomuto/protokit",
-	)
-
-	// Used by //metropolis/node/build/mkcpio
-	p.collect("github.com/cavaliergopher/cpio", "b4d3577d12deb76a6d52f184acd341f875574785")
-
-	// First generate the repositories starlark rule into memory. This is because
-	// rendering will lock all unlocked dependencies, which might take a while. If a
-	// use were to interrupt it now, they would end up with an incomplete
-	// repositories.bzl and would have to restore from git.
-	buf := bytes.NewBuffer(nil)
-	err = p.render(buf)
-	if err != nil {
-		return fmt.Errorf("could not render deps: %w", err)
-	}
-
-	err = os.WriteFile(repositoriesBzlPath, buf.Bytes(), 0666)
-	if err != nil {
-		return fmt.Errorf("could not write deps: %w", err)
-	}
-	return nil
-}
diff --git a/build/fietsje/planner.go b/build/fietsje/planner.go
deleted file mode 100644
index 9e4889c..0000000
--- a/build/fietsje/planner.go
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package fietsje
-
-import (
-	"fmt"
-)
-
-// The Planner provides the main DSL and high-level control logic for resolving
-// dependencies. It is the main API that fietsje users should consume.
-
-// planner is a builder for a single world of Go package dependencies, and what is
-// then emitted into a Starlark file containing gazelle go_repository rules. The
-// planner's builder system covers three increasingly specific contexts:
-//  - planner (this structure, allows for 'collecting' in high-level dependencies. ie. collections)
-//  - collection (represents what has been pulled in by a high-level dependency, and allows for 'using' transitive
-//    dependencies from a collection)
-//  - optionized (represents a collection with extra build flags, eg. disabled proto builds)
-type planner struct {
-	// available is a map of importpaths to dependencies that the planner knows. This
-	// is a flat structure that is the main source of truth of actual dependency data,
-	// like a registry of everything that the planner knows about. The available
-	// dependency for a given importpath, as the planner progresses, might change, ie.
-	// when there is a version conflict. As such, code should use importpaths as atoms
-	// describing dependencies, instead of holding dependency pointers.
-	available map[string]*dependency
-	// enabled is a map of dependencies that will be emitted by the planner into the
-	// build via Gazelle.
-	enabled map[string]bool
-	// seen is a map of 'dependency' -> 'parent' importpaths, ie. returns what higher-
-	// level dependency (ie. one enabled with .collect()) pulled in a given dependency.
-	// This is only used for error messages to help the user find what a transitive
-	// dependency has been pulled in by.
-	seen map[string]string
-
-	shelf *shelf
-}
-
-func (p *planner) collect(importpath, version string, opts ...buildOpt) *collection {
-	return p.collectInternal(importpath, version, false, opts...)
-}
-
-func (p *planner) collectOverride(importpath, version string, opts ...buildOpt) *collection {
-	return p.collectInternal(importpath, version, true, opts...)
-}
-
-// collectInternal pulls in a high-level dependency into the planner and
-// enables it. It also parses all of its transitive // dependencies (not just
-// directly transitive, but recursively transitive) and makes the planner aware
-// of them. It does not enable these transitive dependencies, but returns a
-// collection builder, which can be used to do se by calling .use().
-func (p *planner) collectInternal(importpath, version string, override bool, opts ...buildOpt) *collection {
-	// Ensure overrides are explicit and minimal.
-	by, ok := p.seen[importpath]
-	if ok && !override {
-		panic(fmt.Errorf("%s is being collected, but has already been declared by %s; replace it by a use(%q) call on %s or use collectOverride", importpath, by, importpath, by))
-	}
-	if !ok && override {
-		panic(fmt.Errorf("%s is being collected with override, but has not been seen as a dependency previously - use .collect(%q, %q) instead", importpath, importpath, version))
-	}
-
-	d := &dependency{
-		shelf:      p.shelf,
-		importpath: importpath,
-		version:    version,
-	}
-	for _, o := range opts {
-		o(d)
-	}
-
-	// automatically enable direct import
-	p.enabled[d.importpath] = true
-	p.available[d.importpath] = d
-
-	td, err := d.getTransitiveDeps()
-	if err != nil {
-		panic(fmt.Errorf("could not get transitive deps for %q: %v", d.importpath, err))
-	}
-	// add transitive deps to 'available' map
-	for k, v := range td {
-		// skip dependencies that have already been enabled, dependencies are 'first
-		// enabled version wins'.
-		if _, ok := p.available[k]; ok && p.enabled[k] {
-			continue
-		}
-
-		p.available[k] = v
-
-		// make note of the high-level dependency that pulled in the dependency.
-		p.seen[v.importpath] = d.importpath
-	}
-
-	return &collection{
-		p:          p,
-		highlevel:  d,
-		transitive: td,
-	}
-}
-
-// collection represents the context of the planner after pulling/collecting in a
-// high-level dependency. In this state, the planner can be used to enable
-// transitive dependencies of the high-level dependency.
-type collection struct {
-	p *planner
-
-	highlevel  *dependency
-	transitive map[string]*dependency
-}
-
-// use enables given dependencies defined in the collection by a high-level
-// dependency.
-func (c *collection) use(paths ...string) *collection {
-	return c.with().use(paths...)
-}
-
-// replace injects a new dependency with a replacement importpath. This is used to
-// reflect 'replace' stanzas in go.mod files of third-party dependencies. This is
-// not done automatically by Fietsje, as a replacement is global to the entire
-// build tree, and should be done knowingly and explicitly by configuration. The
-// 'oldpath' importpath will be visible to the build system, but will be backed at
-// 'newpath' locked at 'version'.
-func (c *collection) replace(oldpath, newpath, version string) *collection {
-	// Ensure oldpath is in use. We want as little replacements as possible, and if
-	// it's not being used by anything, it means that we likely don't need it.
-	c.use(oldpath)
-
-	d := c.highlevel.child(oldpath, version)
-	d.replace = newpath
-	c.transitive[oldpath] = d
-	c.p.available[oldpath] = d
-	c.p.enabled[oldpath] = true
-
-	return c
-}
-
-// inject adds a dependency to a collection as if requested by the high-level
-// dependency of the collection. This should be used sparingly, for instance when
-// high-level dependencies contain bazel code that uses some external workspaces
-// from Go modules, and those workspaces are not defined in parsed transitive
-// dependency definitions like go.mod/sum.
-func (c *collection) inject(importpath, version string, opts ...buildOpt) *collection {
-	d := c.highlevel.child(importpath, version)
-	c.transitive[importpath] = d
-	c.p.available[importpath] = d
-	c.p.enabled[importpath] = true
-	for _, o := range opts {
-		o(c.transitive[importpath])
-	}
-
-	return c
-}
-
-// with transforms a collection into an optionized, by setting some build options.
-func (c *collection) with(o ...buildOpt) *optionized {
-	return &optionized{
-		c:    c,
-		opts: o,
-	}
-}
-
-// optionized is a collection that has some build options set, that will be applied
-// to all dependencies 'used' in this context
-type optionized struct {
-	c    *collection
-	opts []buildOpt
-}
-
-// buildOpt is a build option passed to Gazelle.
-type buildOpt func(d *dependency)
-
-// buildTags sets the given buildTags in affected dependencies.
-func buildTags(tags ...string) buildOpt {
-	return func(d *dependency) {
-		d.buildTags = tags
-	}
-}
-
-// disabledProtoBuild disables protobuf builds in affected dependencies.
-func disabledProtoBuild(d *dependency) {
-	d.disableProtoBuild = true
-}
-
-// patches applies patches in affected dependencies after BUILD file generation.
-func patches(patches ...string) buildOpt {
-	return func(d *dependency) {
-		d.patches = patches
-	}
-}
-
-// prePatches applies patches in affected dependencies before BUILD file
-// generation.
-func prePatches(patches ...string) buildOpt {
-	return func(d *dependency) {
-		d.prePatches = patches
-	}
-}
-
-// useImportAliasNaming instructs Gazelle to name the generated targets in a way
-// which is both compatible with the old go_default_library convention as well
-// as the import convention. See `go_naming_convention=import_alias` in Gazelle.
-func useImportAliasNaming(d *dependency) {
-	d.useImportAliasNaming = true
-}
-
-func forceBazelGeneration(d *dependency) {
-	d.forceBazelGeneration = true
-}
-
-func buildExtraArgs(args ...string) buildOpt {
-	return func(d *dependency) {
-		d.buildExtraArgs = args
-	}
-}
-
-// use enables given dependencies defined in the collection by a high-level
-// dependency, with any set build options. After returning, the builder degrades to
-// a collection - ie, all build options are reset.
-func (o *optionized) use(paths ...string) *collection {
-	for _, path := range paths {
-		el, ok := o.c.transitive[path]
-		if !ok {
-			msg := fmt.Sprintf("dependency %q not found in %q", path, o.c.highlevel.importpath)
-			if alternative, ok := o.c.p.seen[path]; ok {
-				msg += fmt.Sprintf(" (but found in %q)", alternative)
-			} else {
-				msg += " or any other collected library"
-			}
-			panic(msg)
-		}
-		for _, o := range o.opts {
-			o(el)
-		}
-		o.c.p.enabled[path] = true
-	}
-
-	return o.c
-}
diff --git a/build/fietsje/proto/BUILD.bazel b/build/fietsje/proto/BUILD.bazel
deleted file mode 100644
index d1a3b83..0000000
--- a/build/fietsje/proto/BUILD.bazel
+++ /dev/null
@@ -1,23 +0,0 @@
-load("@rules_proto//proto:defs.bzl", "proto_library")
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
-
-proto_library(
-    name = "proto_proto",
-    srcs = ["shelf.proto"],
-    visibility = ["//visibility:public"],
-)
-
-go_proto_library(
-    name = "proto_go_proto",
-    importpath = "source.monogon.dev/build/fietsje/proto",
-    proto = ":proto_proto",
-    visibility = ["//visibility:public"],
-)
-
-go_library(
-    name = "proto",
-    embed = [":proto_go_proto"],
-    importpath = "source.monogon.dev/build/fietsje/proto",
-    visibility = ["//visibility:public"],
-)
diff --git a/build/fietsje/proto/shelf.proto b/build/fietsje/proto/shelf.proto
deleted file mode 100644
index fa454bb..0000000
--- a/build/fietsje/proto/shelf.proto
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-syntax = "proto3";
-package build.fietsje;
-option go_package = "source.monogon.dev/build/fietsje/proto";
-
-// The Shelf is a cache/lockfile of Fietsje dependencies. See //build/fietsje/shelf.go for more information.
-// This proto definition is used to generate text proto files. As such, repeated fields have singular names.
-
-message Shelf {
-    message Entry {
-        string import_path = 1;
-        string version = 2;
-        string bazel_name = 3;
-        string sum = 4;
-        string semver = 5;
-    }
-    repeated Entry entry = 1;
-}
diff --git a/build/fietsje/render.go b/build/fietsje/render.go
deleted file mode 100644
index 5ad26d0..0000000
--- a/build/fietsje/render.go
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package fietsje
-
-import (
-	"fmt"
-	"io"
-	"sort"
-)
-
-// render writes a gazelle-compatible starlark file based on the enabled
-// dependencies in this planner.
-func (p *planner) render(w io.Writer) error {
-	fmt.Fprintln(w, `load("@bazel_gazelle//:deps.bzl", "go_repository")`)
-	fmt.Fprintln(w, ``)
-	fmt.Fprintln(w, `def go_repositories():`)
-
-	// Get and sort all enabled importpaths.
-	var enabled []string
-	for importpath, _ := range p.enabled {
-		enabled = append(enabled, importpath)
-	}
-	sort.Slice(enabled, func(i, j int) bool { return enabled[i] < enabled[j] })
-
-	// Render all importpaths.
-	for _, importpath := range enabled {
-		d := p.available[importpath]
-		if err := d.lock(); err != nil {
-			return fmt.Errorf("could not lock %q: %v", importpath, err)
-		}
-
-		fmt.Fprintf(w, "    go_repository(\n")
-		fmt.Fprintf(w, "        name = %q,\n", d.locked.bazelName)
-		fmt.Fprintf(w, "        importpath = %q,\n", d.importpath)
-		fmt.Fprintf(w, "        version = %q,\n", d.locked.semver)
-		fmt.Fprintf(w, "        sum = %q,\n", d.locked.sum)
-		if d.replace != "" {
-			fmt.Fprintf(w, "        replace = %q,\n", d.replace)
-		}
-		if d.disableProtoBuild {
-			fmt.Fprintf(w, "        build_file_proto_mode = %q,\n", "disable")
-		}
-		if d.forceBazelGeneration {
-			fmt.Fprintf(w, "        build_file_generation = %q,\n", "on")
-		}
-		if d.buildTags != nil {
-			fmt.Fprintf(w, "        build_tags = [\n")
-			for _, tag := range d.buildTags {
-				fmt.Fprintf(w, "            %q,\n", tag)
-			}
-			fmt.Fprintf(w, "        ],\n")
-		}
-		if d.patches != nil {
-			fmt.Fprintf(w, "        patches = [\n")
-			for _, patch := range d.patches {
-				fmt.Fprintf(w, "            %q,\n", "//third_party/go/patches:"+patch)
-			}
-			fmt.Fprintf(w, "        ],\n")
-		}
-		if d.prePatches != nil {
-			fmt.Fprintf(w, "        pre_patches = [\n")
-			for _, patch := range d.prePatches {
-				fmt.Fprintf(w, "            %q,\n", "//third_party/go/patches:"+patch)
-			}
-			fmt.Fprintf(w, "        ],\n")
-		}
-		if d.patches != nil || d.prePatches != nil {
-			fmt.Fprintf(w, "        patch_args = [%q],\n", "-p1")
-		}
-		fmt.Fprintf(w, "        build_extra_args = [\n")
-		if d.useImportAliasNaming {
-			fmt.Fprintf(w, "            %q,\n", "-go_naming_convention=import_alias")
-			fmt.Fprintf(w, "            %q,\n", "-go_naming_convention_external=import_alias")
-		} else {
-			fmt.Fprintf(w, "            %q,\n", "-go_naming_convention=go_default_library")
-			fmt.Fprintf(w, "            %q,\n", "-go_naming_convention_external=go_default_library")
-		}
-		for _, arg := range d.buildExtraArgs {
-			fmt.Fprintf(w, "            %q,\n", arg)
-		}
-		fmt.Fprintf(w, "        ],\n")
-		fmt.Fprintf(w, "    )\n")
-	}
-	return nil
-}
diff --git a/build/fietsje/shelf.go b/build/fietsje/shelf.go
deleted file mode 100644
index c377186..0000000
--- a/build/fietsje/shelf.go
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package fietsje
-
-import (
-	"bytes"
-	"fmt"
-	"log"
-	"os"
-	"sort"
-
-	"github.com/golang/protobuf/proto"
-
-	pb "source.monogon.dev/build/fietsje/proto"
-)
-
-// The Shelf is a combined cache and dependency lockfile, not unlike go.sum. It's
-// implemented as a text proto file on disk, and currently stores a single mapping
-// of shelfKeys to shelfValues, which are in order a (importpath, version) tuple
-// and the `locked` structure of a dependency. The resulting shelf file should be
-// commited to the monogon repository. It can be freely deleted to force recreation
-// from scratch, which can be useful as there is no garbage collection implemented
-// for it. The 'lockfile' aspect of the Shelf is counter-intuitive to what readers
-// might be used to from other dependency management systems. It does not lock a
-// third-party dependency to a particular version, but only locks a well defined
-// version to its checksum. As such, recreating the shelf from scratch should not
-// bump any dependencies, unless some upstream-project retagged a release to a
-// different VCS commit, or a fietsje user pinned to 'master' instead of a
-// particular commit. The effective changes will always be reflected in the
-// resulting starlark repository ruleset, which (also being commited to source
-// control) can be used as a canary of a version being effectively bumped.
-
-// shelfKey is the key into the shelf map structure.
-type shelfKey struct {
-	importpath string
-	version    string
-}
-
-// shelfValue is the entry of a shelf map structure.
-type shelfValue struct {
-	l *locked
-}
-
-// shelf is an in-memory representation of the shelf loaded from disk.
-type shelf struct {
-	path string
-	data map[shelfKey]shelfValue
-}
-
-func shelfLoad(path string) (*shelf, error) {
-	var data []byte
-	var err error
-
-	if _, err := os.Stat(path); os.IsNotExist(err) {
-		log.Printf("Creating new shelf file at %q, this run will be slow.", path)
-	} else {
-		data, err = os.ReadFile(path)
-		if err != nil {
-			return nil, fmt.Errorf("could not read shelf: %v", err)
-		}
-	}
-	var shelfProto pb.Shelf
-	err = proto.UnmarshalText(string(data), &shelfProto)
-	if err != nil {
-		return nil, fmt.Errorf("could not unmarshal shelf: %v", err)
-	}
-
-	res := &shelf{
-		path: path,
-		data: make(map[shelfKey]shelfValue),
-	}
-
-	for _, e := range shelfProto.Entry {
-		k := shelfKey{
-			importpath: e.ImportPath,
-			version:    e.Version,
-		}
-		v := shelfValue{
-			l: &locked{
-				bazelName: e.BazelName,
-				sum:       e.Sum,
-				semver:    e.Semver,
-			},
-		}
-		res.data[k] = v
-	}
-	return res, nil
-}
-
-// get retrieves a given lock entry from the in-memory shelf.
-func (s *shelf) get(importpath, version string) *locked {
-	res, ok := s.data[shelfKey{importpath: importpath, version: version}]
-	if !ok {
-		return nil
-	}
-	return res.l
-}
-
-// put stores a given locked entry in memory. This will not be commited to disk
-// until .save() is called.
-func (s *shelf) put(importpath, version string, l *locked) {
-	s.data[shelfKey{importpath: importpath, version: version}] = shelfValue{l: l}
-}
-
-// save commits the shelf to disk (to the same location it was loaded from), fully
-// overwriting from in-memory data.
-func (s *shelf) save() error {
-	// Build proto representation of shelf data.
-	var shelfProto pb.Shelf
-	for k, v := range s.data {
-		shelfProto.Entry = append(shelfProto.Entry, &pb.Shelf_Entry{
-			ImportPath: k.importpath,
-			Version:    k.version,
-			BazelName:  v.l.bazelName,
-			Sum:        v.l.sum,
-			Semver:     v.l.semver,
-		})
-	}
-
-	// Sort shelf keys by importpath, then by version.
-	sort.Slice(shelfProto.Entry, func(i, j int) bool {
-		a := shelfProto.Entry[i]
-		b := shelfProto.Entry[j]
-
-		if a.ImportPath < b.ImportPath {
-			return true
-		}
-		if a.ImportPath > b.ImportPath {
-			return false
-		}
-		return a.Version < b.Version
-	})
-
-	// Make an in-memory representation of the marshaled shelf.
-	buf := bytes.NewBuffer(nil)
-	err := proto.MarshalText(buf, &shelfProto)
-	if err != nil {
-		return fmt.Errorf("could not serialize shelf: %v", err)
-	}
-
-	// And write it out.
-	err = os.WriteFile(s.path, buf.Bytes(), 0644)
-	if err != nil {
-		return fmt.Errorf("could not write shelf: %v", err)
-	}
-
-	return nil
-}
diff --git a/build/fietsje/transitive.go b/build/fietsje/transitive.go
deleted file mode 100644
index 6ffd594..0000000
--- a/build/fietsje/transitive.go
+++ /dev/null
@@ -1,192 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package fietsje
-
-import (
-	"fmt"
-	"log"
-	"os"
-	"strings"
-
-	"golang.org/x/mod/modfile"
-)
-
-// getTransitiveDeps is a hairy ball of heuristic used to find all recursively
-// transitive dependencies of a given dependency. It downloads a given dependency
-// using `go get`, and performs analysis of standard (go.mod/go.sum) and project-
-// specific dependency management configuration/lock files in order to build a full
-// view of all known, versioned transitive dependencies.
-func (d *dependency) getTransitiveDeps() (map[string]*dependency, error) {
-	// First, lock the dependency. Downloading it later will also return a sum, and we
-	// want to ensure both are the same.
-	err := d.lock()
-	if err != nil {
-		return nil, fmt.Errorf("could not lock: %v", err)
-	}
-
-	_, path, sum, err := d.download()
-	if err != nil {
-		return nil, fmt.Errorf("could not download: %v", err)
-	}
-
-	if sum != d.locked.sum {
-		return nil, fmt.Errorf("inconsistent sum: %q downloaded, %q in shelf/lock", sum, d.locked.sum)
-	}
-
-	exists := func(p string) bool {
-		full := fmt.Sprintf("%s/%s", path, p)
-		if _, err := os.Stat(full); err == nil {
-			return true
-		}
-		if err != nil && !os.IsExist(err) {
-			panic(fmt.Sprintf("checking file %q: %v", full, err))
-		}
-		return false
-	}
-
-	read := func(p string) []byte {
-		full := fmt.Sprintf("%s/%s", path, p)
-		data, err := os.ReadFile(full)
-		if err != nil {
-			panic(fmt.Sprintf("reading file %q: %v", full, err))
-		}
-		return data
-	}
-
-	requirements := make(map[string]*dependency)
-
-	// Read & parse go.mod if present.
-	var mf *modfile.File
-	if exists("go.mod") {
-		log.Printf("%q: parsing go.mod\n", d.importpath)
-		data := read("go.mod")
-		mf, err = modfile.Parse("go.mod", data, nil)
-		if err != nil {
-			return nil, fmt.Errorf("parsing go.mod in %s: %v", d.importpath, err)
-		}
-	}
-
-	// If a go.mod file was present, interpret it to populate dependencies.
-	if mf != nil {
-		for _, req := range mf.Require {
-			requirements[req.Mod.Path] = d.child(req.Mod.Path, req.Mod.Version)
-		}
-		for _, rep := range mf.Replace {
-			// skip filesystem rewrites
-			if rep.New.Version == "" {
-				continue
-			}
-
-			requirements[rep.New.Path] = d.child(rep.New.Path, rep.New.Version)
-		}
-	}
-
-	// Read parse, and interpret. go.sum if present.
-	// This should bring into view all recursively transitive dependencies.
-	if exists("go.sum") {
-		log.Printf("%q: parsing go.sum", d.importpath)
-		data := read("go.sum")
-		for _, line := range strings.Split(string(data), "\n") {
-			line = strings.TrimSpace(line)
-			if line == "" {
-				continue
-			}
-
-			parts := strings.Fields(line)
-			if len(parts) != 3 {
-				return nil, fmt.Errorf("parsing go.sum: unparseable line %q", line)
-			}
-
-			importpath, version := parts[0], parts[1]
-
-			// Skip if already created from go.mod.
-			// TODO(q3k): error if go.sum and go.mod disagree?
-			if _, ok := requirements[importpath]; ok {
-				continue
-			}
-
-			if strings.HasSuffix(version, "/go.mod") {
-				version = strings.TrimSuffix(version, "/go.mod")
-			}
-			requirements[importpath] = d.child(importpath, version)
-		}
-	}
-
-	// Special case: root Kubernetes repo - rewrite staging/ deps to k8s.io/ at correct
-	// versions, quit early. Kubernetes vendors all dependencies into vendor/, and also
-	// contains sub-projects (components) in staging/. This converts all staging
-	// dependencies into appropriately versioned k8s.io/<dep> paths.
-	if d.importpath == "k8s.io/kubernetes" {
-		log.Printf("%q: special case for Kubernetes main repository", d.importpath)
-		if mf == nil {
-			return nil, fmt.Errorf("k8s.io/kubernetes needs a go.mod")
-		}
-		// extract the version, turn into component version
-		version := d.version
-		if !strings.HasPrefix(version, "v") {
-			return nil, fmt.Errorf("invalid version format for k8s: %q", version)
-		}
-		version = version[1:]
-		componentVersion := fmt.Sprintf("kubernetes-%s", version)
-
-		// find all k8s.io 'components'
-		components := make(map[string]bool)
-		for _, rep := range mf.Replace {
-			if !strings.HasPrefix(rep.Old.Path, "k8s.io/") || !strings.HasPrefix(rep.New.Path, "./staging/src/") {
-				continue
-			}
-			components[rep.Old.Path] = true
-		}
-
-		// add them to planner at the 'kubernetes-$ver' tag
-		for component, _ := range components {
-			requirements[component] = d.child(component, componentVersion)
-		}
-		return requirements, nil
-	}
-
-	// Special case: github.com/containerd/containerd: read vendor.conf.
-	if d.importpath == "github.com/containerd/containerd" {
-		log.Printf("%q: special case for containerd", d.importpath)
-		if !exists("vendor.conf") {
-			panic("containerd needs vendor.conf")
-		}
-		data := read("vendor.conf")
-		for _, line := range strings.Split(string(data), "\n") {
-			// strip comments
-			parts := strings.SplitN(line, "#", 2)
-			line = parts[0]
-
-			// skip empty contents
-			line = strings.TrimSpace(line)
-			if line == "" {
-				continue
-			}
-
-			// read dep/version pairs
-			parts = strings.Fields(line)
-			if len(parts) < 2 {
-				return nil, fmt.Errorf("unparseable line in containerd vendor.conf: %q", line)
-			}
-			importpath, version := parts[0], parts[1]
-			requirements[importpath] = d.child(importpath, version)
-		}
-		return requirements, nil
-	}
-
-	return requirements, nil
-}
