diff --git a/slides/makefiles/PS/general_make.md b/slides/makefiles/PS/general_make.md
new file mode 100644
index 0000000..a15ec96
--- /dev/null
+++ b/slides/makefiles/PS/general_make.md
@@ -0,0 +1,119 @@
+# Generalizing Makefiles for All Occasions
+
+- Rules are bad,
+- standards are good,
+- habits are better.
+
+***
+
+# General Standards
+
+- `make help`
+- `make check`
+- `sudo make install`
+
+**NB:** we separate `make` from `make install` so that the files are not build with the user `root` as the owner.
+
+***
+
+# Service Standards
+
+- `make backup.tgz`
+- `make install`
+
+## Service Backups in Two Files
+
+- `configs`: configuration files, all tracked in git.
+- `store`: passwords and binary files, not tracked in git.
+
+## New Abilities Unlocked
+
+- Open Access Administration.
+- Sharing admin configs with hacker spaces.
+
+***
+
+## BEHOLD: The Everything Makefile
+
+***
+
+```make
+CONFIGS = $(patsubst /%,%,$(shell cat configs))
+STORE = $(patsubst /%,%,$(shell cat store))
+CP = mkdir -p $(dir $@) && cp -a
+IGNORE_FILE = $(shell test -d .git/info && echo .git/info/exclude || echo .gitignore)
+GIT_COMMIT = git commit -m"add $@" --no-gpg-sign --no-signoff
+SELECTOR != command -v sk || command -v fzy || command -f fzf
+.PHONY: all
+all: init backup.tgz $(IGNORE_FILE)
+backup.tgz: $(CONFIGS) $(STORE)
+ tar czf $@ $^
+$(IGNORE_FILE): store
+ echo $(STORE) backup.tgz | tr ' ' '\n' > $@
+.PHONY: init
+init: configs store
+configs store:
+ while con="$$(find /var /etc/ /sys/ -maxdepth 2 -mindepth 1 -type f 2>/dev/null | $(SELECTOR) -p "Select files for $@\nPress Ctrl+d once done")"; do \
+ echo "$$con"; \
+ done > $@
+$(CONFIGS): %: /%
+ $(CP) $< $@
+ git add $@
+ $(GIT_COMMIT)
+ $(info made git commit for $@)
+$(STORE): %: /%
+ $(CP) $< $@
+clean:
+ $(RM) -r $(CONFIGS) $(STORE) backup.tgz
+```
+
+***
+
+## Example: Soft Serve Makefile
+
+
+The `configs` file:
+
+```
+/etc/soft-serve.conf
+/var/lib/soft-serve/data/config.yaml
+/var/lib/soft-serve/data/file
+/etc/nginx/sites-enabled/soft.dmz.rs
+/etc/nginx/sites-available/soft.dmz.rs
+```
+
+
+The `store` file:
+
+```
+/var/lib/soft-serve/data/lfs
+/var/lib/soft-serve/data/repo
+/var/lib/soft-serve/data/soft
+/etc/letsencrypt/archive/soft
+/etc/letsencrypt/live/soft.dm
+/var/lib/soft-serve/data/ssh/
+```
+
+***
+
+# Other Build Systems
+
+> "*What if I want to use this other thing, instead of a makefile?"
+
+***
+
+# Other Build Systems (Sans Heresy)
+
+> "*What if I want to use this other thing, instead of a makefile?"
+
+- Easy: just use a Makefile.
+
+
+```make
+
+[ ... ]
+
+public/: src/
+ python build_pages.py
+```
+
diff --git a/slides/makefiles/PS/omni_makefile b/slides/makefiles/PS/omni_makefile
new file mode 100644
index 0000000..623949c
--- /dev/null
+++ b/slides/makefiles/PS/omni_makefile
@@ -0,0 +1,34 @@
+CONFIGS = $(patsubst /%,%,$(shell cat configs))
+STORE = $(patsubst /%,%,$(shell cat store))
+CP = mkdir -p $(dir $@) && cp -a
+IGNORE_FILE = $(shell test -d .git/info && echo .git/info/exclude || echo .gitignore)
+GIT_COMMIT = git commit -m"add $@" --no-gpg-sign --no-signoff
+SELECTOR != command -v sk || command -v fzy || command -f fzf
+
+.PHONY: all
+all: init backup.tgz $(IGNORE_FILE)
+
+backup.tgz: $(CONFIGS) $(STORE)
+ tar czf $@ $^
+
+$(IGNORE_FILE): store
+ echo $(STORE) backup.tgz | tr ' ' '\n' > $@
+
+.PHONY: init
+init: configs store
+
+configs store:
+ while con="$$(find /var /etc/ /sys/ -maxdepth 2 -mindepth 1 -type f 2>/dev/null | $(SELECTOR) -p "Select files for $@\nPress Ctrl+d once done")"; do \
+ echo "$$con"; \
+ done > $@
+
+$(CONFIGS): %: /%
+ $(CP) $< $@
+ git add $@
+ $(GIT_COMMIT)
+ $(info made git commit for $@)
+$(STORE): %: /%
+ $(CP) $< $@
+
+clean:
+ $(RM) -r $(CONFIGS) $(STORE) backup.tgz
diff --git a/slides/makefiles/examples/omni_makefile b/slides/makefiles/examples/omni_makefile
new file mode 120000
index 0000000..16537f8
--- /dev/null
+++ b/slides/makefiles/examples/omni_makefile
@@ -0,0 +1 @@
+../PS/omni_makefile
\ No newline at end of file