diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index cd03c178ef8b5e5a7df8f6e99aff870ba18354b9..1f489c7373f971845f7400fde3dfb44b5924895d 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -14,6 +14,7 @@ jobs:
       with:
         path: ./src/github.com/neilpa/yajsv
     - name: Build
-      run: go build -v ./...
-    - name: Test
-      run: go test ./...
+      run: make ci
+    - name: List Files
+      shell: bash
+      run: ls -altr
diff --git a/Makefile b/Makefile
index ea272e8183e89214d9712b14ea80f58fbd4be8a7..1fb0cf49570baa78d810e0cf87852310807abaee 100644
--- a/Makefile
+++ b/Makefile
@@ -1,12 +1,31 @@
 ARCH := darwin/amd64 linux/386 linux/amd64 windows/386 windows/amd64
 VERSION := $(shell git describe --always --dirty)
 LDFLAGS := -ldflags "-X main.version=${VERSION}"
+BUILD_DIR := build
 
-yajsv: *.go
+.PHONY: build
+build: *.go
 	go build ${LDFLAGS}
 
+.PHONY: release
 release: *.go
-	gox -output 'build/{{.Dir}}.{{.OS}}.{{.Arch}}' -osarch "${ARCH}" ${LDFLAGS}
+	gox -output '${BUILD_DIR}/{{.Dir}}.{{.OS}}.{{.Arch}}' -osarch "${ARCH}" ${LDFLAGS}
 
+.PHONY: clean
 clean:
-	rm -rf build yajsv
+	rm -rf ${BUILD_DIR} yajsv yajsv.exe coverage.out
+
+.PHONY: fmt
+fmt:
+	go fmt 	./...
+
+.PHONY: tidy
+tidy:
+	go mod tidy -v
+
+.PHONY: test
+test:
+	go test -coverprofile=coverage.out ./...
+
+.PHONY: ci
+ci: clean test build
\ No newline at end of file
diff --git a/main.go b/main.go
index 96c19b180ba4d7ae96a5ae4a0931f60e121dd75b..8ee176722d202dd82842a37e424ba339d9566d12 100644
--- a/main.go
+++ b/main.go
@@ -21,7 +21,7 @@ import (
 )
 
 var (
-	version = "v1.3.0-dev"
+	version     = "v1.3.0-dev"
 	schemaFlag  = flag.String("s", "", "primary JSON schema to validate against, required")
 	quietFlag   = flag.Bool("q", false, "quiet, only print validation failures and errors")
 	versionFlag = flag.Bool("v", false, "print version and exit")