diff --git a/Makefile b/Makefile
index fc1e79738e1d0d9c36f92ed4df2b94f7322593d7..9cd7f86fbfa1027a1c8c5599231b03baae21460d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,26 +1,61 @@
 JSONNET_FMT := jsonnet fmt -n 2 --max-blank-lines 2 --string-style s --comment-style s
 
-image:
-	docker build -f ../../scripts/jsonnet/Dockerfile -t po-jsonnet ../../
+JB_BINARY:=$(GOPATH)/bin/jb
+EMBEDMD_BINARY:=$(GOPATH)/bin/embedmd
 
-generate: image
+# edit 1
+
+all: generate fmt test
+
+../../hack/jsonnet-docker-image: ../../scripts/jsonnet/Dockerfile
+# Create empty target file, for the sole purpose of recording when this target
+# was last executed via the last-modification timestamp on the file. See
+# https://www.gnu.org/software/make/manual/make.html#Empty-Targets
+	docker build -f - -t po-jsonnet . < ../../scripts/jsonnet/Dockerfile
+	touch $@
+
+generate-in-docker: ../../hack/jsonnet-docker-image
 	@echo ">> Compiling assets and generating Kubernetes manifests"
-	docker run --rm -u=$(shell id -u $(USER)):$(shell id -g $(USER)) -v $(shell dirname $(dir $(abspath $(dir $$PWD)))):/go/src/github.com/coreos/prometheus-operator/ --workdir /go/src/github.com/coreos/prometheus-operator/contrib/kube-prometheus po-jsonnet make generate-raw
+	docker run \
+	--rm \
+	-u=$(shell id -u $(USER)):$(shell id -g $(USER)) \
+	-v $(shell dirname $(dir $(abspath $(dir $$PWD)))):/go/src/github.com/coreos/prometheus-operator/ \
+	--workdir /go/src/github.com/coreos/prometheus-operator/contrib/kube-prometheus \
+	po-jsonnet make generate
+
+generate: manifests/** **.md
+
+**.md: $(EMBEDMD_BINARY) $(shell find examples) build.sh example.jsonnet
+	echo '>>> inside **.md'
+	$(EMBEDMD_BINARY) -w `find . -name "*.md" | grep -v vendor`
 
-generate-raw: fmt
-	jb install
+manifests/**: vendor/** example.jsonnet
 	./build.sh
 
+vendor/**: $(JB_BINARY) jsonnetfile.json
+	$(JB_BINARY) install
+
 fmt:
 	find . -name 'vendor' -prune -o -name '*.libsonnet' -o -name '*.jsonnet' -print | \
 		xargs -n 1 -- $(JSONNET_FMT) -i
 
-test: image
+test: $(JB_BINARY)
+	$(JB_BINARY) install
+	./test.sh
+
+test-in-docker: ../../hack/jsonnet-docker-image
 	@echo ">> Compiling assets and generating Kubernetes manifests"
-	docker run --rm -u=$(shell id -u $(USER)):$(shell id -g $(USER)) -v $(shell dirname $(dir $(abspath $(dir $$PWD)))):/go/src/github.com/coreos/prometheus-operator/ --workdir /go/src/github.com/coreos/prometheus-operator/contrib/kube-prometheus po-jsonnet make test-raw
+	docker run \
+	--rm \
+	-u=$(shell id -u $(USER)):$(shell id -g $(USER)) \
+	-v $(shell dirname $(dir $(abspath $(dir $$PWD)))):/go/src/github.com/coreos/prometheus-operator/ \
+	--workdir /go/src/github.com/coreos/prometheus-operator/contrib/kube-prometheus \
+	po-jsonnet make test
 
-test-raw: crdtojsonnet
-	jb install
-	./test.sh
+$(JB_BINARY):
+	go get -u github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb
+
+$(EMBEDMD_BINARY):
+	go get github.com/campoy/embedmd
 
-.PHONY: image generate crdtojsonnet generate-raw test test-raw fmt
+.PHONY: generate generate-in-docker test test-in-docker fmt