+# atomically create file by command
+cmdsave = @echo '$1' $2 \>$@; mispipe '$1 $2' 'ifne sponge $@'
+# download git checkout
+gitsave = @if cd $@ 2>/dev/null; \
+ then echo git pull $@; git pull -q --ff-only || true; \
+ else echo git clone $1 $@; git clone -q --progress $1 $@; fi
+
+sitemap.xml: tools/mksitemap
+ $(call cmdsave,$<)
+
+light.css: tools/stripcss base.css
+ $(call cmdsave,$^)
+
+plan.plp: TODO
+ kramdown $< >$@
+
+UPDATE: $(download)
+ $(call cmdsave,git log -1 --date=short --pretty="%ad %s")
+
+cache: $(patsubst %.inc.pl,data/%.json,$(wildcard charset-*.inc.pl) writing-latn.inc.pl)
+word: word/put.min.js data/wordlist.en.json data/wordlist.nl.json data/wordlist.ru.json data/wordpairs.json
+
+word/put.js: $(download)
+ tools/wget-ifmodified https://github.com/kriszyp/put-selector/raw/master/put.js $@
+word/%.min.js: word/%.js
+ uglifyjs -m '' $< -o $@
+
+data: data/digraphs.inc.pl data/unicode-cover.inc.pl data/countries.inc.pl data/browser data/termcol-xcolor.inc.pl data/digraphs-xorg.inc.pl data/unicode-sampler word
+
+data/DerivedAge.txt: $(download)