diff --git a/Makefile b/Makefile
index 0c4cc0794662bbf449473c4b103e3243e4ae0c1b..f47734f0d78483da86fbbbf0c24fdac5fc4babdd 100644
--- a/Makefile
+++ b/Makefile
@@ -1,66 +1,53 @@
 SHELL=/bin/bash -o pipefail
 
-JSONNET_ARGS := -n 2 --max-blank-lines 2 --string-style s --comment-style s
-ifneq (,$(shell which jsonnetfmt))
-	JSONNET_FMT_CMD := jsonnetfmt
-else
-	JSONNET_FMT_CMD := jsonnet
-	JSONNET_FMT_ARGS := fmt $(JSONNET_ARGS)
-endif
-JSONNET_FMT := $(JSONNET_FMT_CMD) $(JSONNET_FMT_ARGS)
+BIN_DIR?=$(shell pwd)/tmp/bin
 
-FIRST_GOPATH:=$(firstword $(subst :, ,$(shell go env GOPATH)))
-JB_BINARY:=$(FIRST_GOPATH)/bin/jb
-EMBEDMD_BINARY := embedmd
-CONTAINER_CMD:=docker run --rm \
-		-e http_proxy -e https_proxy -e no_proxy \
-		-u="$(shell id -u):$(shell id -g)" \
-		-v "$(shell go env GOCACHE):/.cache/go-build" \
-		-v "$(PWD):/go/src/github.com/coreos/kube-prometheus:Z" \
-		-w "/go/src/github.com/coreos/kube-prometheus" \
-		quay.io/coreos/jsonnet-ci
+EMBEDMD_BIN=$(BIN_DIR)/embedmd
+JB_BIN=$(BIN_DIR)/jb
+GOJSONTOYAML_BIN=$(BIN_DIR)/gojsontoyaml
+JSONNET_BIN=$(BIN_DIR)/jsonnet
+JSONNETFMT_BIN=$(BIN_DIR)/jsonnetfmt
+TOOLING=$(EMBEDMD_BIN) $(JB_BIN) $(GOJSONTOYAML_BIN) $(JSONNET_BIN) $(JSONNETFMT_BIN)
 
-all: generate fmt test
+JSONNETFMT_ARGS=-n 2 --max-blank-lines 2 --string-style s --comment-style s
 
-.PHONY: generate-in-docker
-generate-in-docker:
-	@echo ">> Compiling assets and generating Kubernetes manifests"
-	$(CONTAINER_CMD) make $(MFLAGS) generate
+all: generate fmt test
 
 .PHONY: clean
 clean:
 	# Remove all files and directories ignored by git.
 	git clean -Xfd .
 
+.PHONY: generate
 generate: manifests **.md
 
-**.md: $(shell find examples) build.sh example.jsonnet
-	$(EMBEDMD_BINARY) -w `find . -name "*.md" | grep -v vendor`
+**.md: $(EMBEDMD_BIN) $(shell find examples) build.sh example.jsonnet
+	$(EMBEDMD_BIN) -w `find . -name "*.md" | grep -v vendor`
 
-manifests: examples/kustomize.jsonnet vendor build.sh
-	rm -rf manifests
+manifests: examples/kustomize.jsonnet $(GOJSONTOYAML_BIN) vendor build.sh
 	./build.sh $<
 
-vendor: $(JB_BINARY) jsonnetfile.json jsonnetfile.lock.json
+vendor: $(JB_BIN) jsonnetfile.json jsonnetfile.lock.json
 	rm -rf vendor
-	$(JB_BINARY) install
+	$(JB_BIN) install
 
-fmt:
+.PHONY: fmt
+fmt: $(JSONNETFMT_BIN)
 	find . -name 'vendor' -prune -o -name '*.libsonnet' -o -name '*.jsonnet' -print | \
-		xargs -n 1 -- $(JSONNET_FMT) -i
+		xargs -n 1 -- $(JSONNETFMT_BIN) $(JSONNETFMT_ARGS) -i
 
-test: $(JB_BINARY)
-	$(JB_BINARY) install
+.PHONY: test
+test: $(JB_BIN)
+	$(JB_BIN) install
 	./test.sh
 
+.PHONY: test-e2e
 test-e2e:
 	go test -timeout 55m -v ./tests/e2e -count=1
 
-test-in-docker:
-	@echo ">> Compiling assets and generating Kubernetes manifests"
-	$(CONTAINER_CMD) make $(MFLAGS) test
-
-.PHONY: generate generate-in-docker test test-in-docker fmt
+$(BIN_DIR):
+	mkdir -p $(BIN_DIR)
 
-$(JB_BINARY):
-	go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb@v0.3.1
+$(TOOLING): $(BIN_DIR)
+	@echo Installing tools from scripts/tools.go
+	@cd scripts && cat tools.go | grep _ | awk -F'"' '{print $$2}' | xargs -tI % go build -o $(BIN_DIR) %