diff --git a/renovate.json b/.renovaterc.json
similarity index 100%
rename from renovate.json
rename to .renovaterc.json
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..60d994e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,55 @@
+# dwm - dynamic window manager
+# See LICENSE file for copyright and license details.
+.PHONY: all clean install uninstall
+
+include config.mk
+
+SRC = drw.c dwm.c util.c
+OBJ = ${SRC:.c=.o}
+
+all: dwm
+
+*.c: buildroot
+*.h: buildroot
+.c.o:
+	${CC} -c ${CFLAGS} $<
+
+dwm.o: buildroot config.h
+config.mk:
+	cp config/config.mk config.mk
+config.h:
+	cp config/config.h config.h
+
+${OBJ}: config.h config.mk
+
+dwm: ${OBJ} buildroot
+	${CC} -o $@ ${OBJ} ${LDFLAGS}
+
+clean:
+	find . -maxdepth 1 -type f  | grep -Pv "^\./\.|Makefile$$" | xargs -r rm
+	rm -r tmp patch 2>/dev/null || true
+	git -C dwm-flexipatch reset --hard HEAD
+	git -C dwm-flexipatch clean -fdx
+
+buildroot:
+	cp config/patches.h dwm-flexipatch/patches.h
+	flexipatch-finalizer/flexipatch-finalizer.sh -r -d dwm-flexipatch -o tmp
+	rm -r tmp/Makefile tmp/config.mk patch 2>/dev/null || true
+	mv tmp/* ./
+	for patch in config/patches/*.diff; do patch <"$$patch"; done
+
+install: all
+	mkdir -p ${DESTDIR}${PREFIX}/bin
+	cp -f dwm ${DESTDIR}${PREFIX}/bin
+	chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
+	mkdir -p ${DESTDIR}${MANPREFIX}/man1
+	sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
+	chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
+	mkdir -p ${DESTDIR}${PREFIX}/share/xsessions
+	test -f ${DESTDIR}${PREFIX}/share/xsessions/dwm.desktop || cp -n dwm.desktop ${DESTDIR}${PREFIX}/share/xsessions
+	chmod 644 ${DESTDIR}${PREFIX}/share/xsessions/dwm.desktop
+
+uninstall:
+	rm -f ${DESTDIR}${PREFIX}/bin/dwm\
+		${DESTDIR}${MANPREFIX}/man1/dwm.1\
+		${DESTDIR}${PREFIX}/share/xsessions/dwm.desktop
diff --git a/build.sh b/build.sh
deleted file mode 100755
index 76dd00b..0000000
--- a/build.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-
-cp config.mk patches.h dwm-flexipatch/
-flexipatch-finalizer/flexipatch-finalizer.sh -r -d dwm-flexipatch -o dwm-final
-git -C dwm-flexipatch reset --hard HEAD && git -C dwm-flexipatch clean -fd
-for patch in patches/*.diff; do
-    patch -d dwm-final <"$patch"
-done
-cp config.h dwm-final/
-cd dwm-final || exit 1
-if [ "$1" = "-i" ]; then
-    sudo make install
-else
-    make
-fi
diff --git a/config.h b/config/config.h
similarity index 100%
rename from config.h
rename to config/config.h
diff --git a/config.mk b/config/config.mk
similarity index 100%
rename from config.mk
rename to config/config.mk
diff --git a/patches.h b/config/patches.h
similarity index 100%
rename from patches.h
rename to config/patches.h
diff --git a/patches/autostart_signal.diff b/config/patches/autostart_signal.diff
similarity index 100%
rename from patches/autostart_signal.diff
rename to config/patches/autostart_signal.diff
diff --git a/patches/stext_buffer_size.diff b/config/patches/stext_buffer_size.diff
similarity index 100%
rename from patches/stext_buffer_size.diff
rename to config/patches/stext_buffer_size.diff
diff --git a/patches/tagmon_scratchpad_floatrules.diff b/config/patches/tagmon_scratchpad_floatrules.diff
similarity index 100%
rename from patches/tagmon_scratchpad_floatrules.diff
rename to config/patches/tagmon_scratchpad_floatrules.diff