diff --git a/.travis.yml b/.travis.yml
index b91eaa3cd833d5728e268e840b7abcb3cfbb4330..441d85066cbd1590479abdad00601aa6c3cccfae 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -15,7 +15,7 @@ matrix:
     - go: tip
 
 before_install:
-  - go get -v github.com/golang/lint/golint
+  - make dep
 
 install:
   - go version
@@ -25,4 +25,4 @@ before_script:
 
 sudo: false
 script:
-  - ./run_tests.sh
+  - make test
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..1c1f8bc2e0be4071d985979b41ed3687da587243
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,33 @@
+CASHIER_CMD := ./cmd/cashier
+CASHIER_BIN := ./cashier
+CASHIERD_BIN := ./cashierd
+CASHIERD_CMD := ./cmd/cashierd
+SRC_FILES = $(shell find * -type f -name '*.go' -not -path 'vendor/*' -not -name 'a_*-packr.go')
+
+all: test build
+
+test: dep
+	go test ./...
+	go install -race $(CASHIER_CMD) $(CASHIERD_CMD)
+	go vet ./...
+	go list ./... |egrep -v 'vendor/|proto$$' |xargs -L1 golint -set_exit_status
+	gofmt -d $(SRC_FILES)
+
+build: cashier cashierd
+
+generate:
+	go generate -x ./...
+
+cashier:
+	go build -o cashier $(CASHIER_CMD)
+
+cashierd: generate
+	go build -o cashierd $(CASHIERD_CMD)
+
+clean:
+	rm -f cashier cashierd
+
+dep:
+	go get -u github.com/golang/lint/golint
+
+.PHONY: dep generate test cashier cashierd
\ No newline at end of file
diff --git a/regen.sh b/regen.sh
deleted file mode 100755
index f525b15092632823c670b7646b98b90be32a095d..0000000000000000000000000000000000000000
--- a/regen.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-# Run this script from the root of the repo to regenerate static content.
-
-set -xue
-
-go get -u github.com/mjibson/esc
-${GOPATH}/bin/esc -ignore '\.go' -prefix 'server' \
-  -o 'server/static/static.go' -pkg 'static' 'server/static'
-
-go get -u github.com/golang/protobuf/protoc-gen-go
-protoc --go_out=plugins=grpc:. proto/signer.proto
diff --git a/run_tests.sh b/run_tests.sh
deleted file mode 100755
index 3b27193098e4fbc253e8cdc11398767f8f2b3e24..0000000000000000000000000000000000000000
--- a/run_tests.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#! /bin/sh
-
-# This can be used as a pre-commit script.  Just run
-#   cp run_tests.sh .git/hooks/pre-commit
-# and it will run before each commit.
-
-set -xue
-
-go install -race -v ./cmd/cashier ./cmd/cashierd
-go list ./... |grep -v vendor/ |xargs go test -race
-gofmt -d $(find * -type f -name '*.go' -not -path 'vendor/*')
-go list ./... |grep -v vendor/ |xargs go vet
-if ! type -f golint > /dev/null; then
-  go get -u github.com/golang/lint/golint
-fi
-go list ./... |egrep -v 'vendor/|proto$' |xargs -L1 golint -set_exit_status