pages.adoc = \ src/content/en/about.adoc \ src/content/eo/pri.adoc \ src/content/es/acerca.adoc \ src/content/fr/a-propos.adoc \ src/content/pt/sobre.adoc \ homes.adoc = \ src/content/en/index.adoc \ src/content/eo/index.adoc \ src/content/es/index.adoc \ src/content/fr/index.adoc \ src/content/pt/index.adoc \ articles.adoc = \ src/content/en/blog/2018/07/17/guix-nixos.adoc \ src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc \ src/content/en/blog/2018/12/21/ytdl-subs.adoc \ src/content/en/blog/2019/06/02/nixos-stateless-workstation.adoc \ src/content/en/blog/2020/08/10/guix-srht.adoc \ src/content/en/blog/2020/08/31/database-i-wish-i-had.adoc \ src/content/en/blog/2020/10/05/cargo2nix.adoc \ src/content/en/blog/2020/10/05/swift2nix.adoc \ src/content/en/blog/2020/10/19/feature-flags.adoc \ src/content/en/blog/2020/10/20/wrong-interviewing.adoc \ src/content/en/blog/2020/11/07/diy-bugs.adoc \ src/content/en/blog/2020/11/08/paradigm-shift-review.adoc \ src/content/en/blog/2020/11/12/database-parsers-trees.adoc \ src/content/en/blog/2020/11/14/local-first-review.adoc \ src/content/en/blog/2021/01/26/remembering-ann.adoc \ src/content/en/blog/2021/02/17/fallible.adoc \ src/content/en/blog/2021/04/29/relational-review.adoc \ src/content/en/pastebin/2016/04/05/rpn.adoc \ src/content/en/pastebin/2018/07/11/nix-pinning.adoc \ src/content/en/pastebin/2018/07/13/guix-nixos-systemd.adoc \ src/content/en/pastebin/2018/07/13/guixbuilder-nixos.adoc \ src/content/en/pastebin/2018/07/13/guixbuilder.adoc \ src/content/en/pastebin/2018/07/13/nix-strpad.adoc \ src/content/en/pastebin/2018/07/25/nix-exps.adoc \ src/content/en/pastebin/2018/07/25/nix-showdrv.adoc \ src/content/en/pastebin/2019/06/08/inconsistent-hash.adoc \ src/content/en/pastebin/2019/12/29/raku-tuple-type.adoc \ src/content/en/pastebin/2020/01/04/guix-import-failure.adoc \ src/content/en/pastebin/2020/02/14/guix-shebang.adoc \ src/content/en/pastebin/2020/11/27/guix-build-local.adoc \ src/content/en/pastebin/2020/12/15/guix-pack-fail.adoc \ src/content/en/pastebin/2021/04/03/naive-slugify-js.adoc \ src/content/en/pastebin/2021/06/08/reading-session-pt1.adoc \ src/content/en/pastebin/2021/06/22/curl-wget.adoc \ src/content/en/pastebin/2021/08/11/h1-spacing.adoc \ src/content/en/pastebin/2021/09/02/sicp-3-19.adoc \ src/content/en/pastebin/2021/09/03/sicp-persistent-queue.adoc \ src/content/en/pastebin/2022/07/14/git-cleanup.adoc \ src/content/en/pastebin/2023/07/22/funcallable-amop.adoc \ src/content/en/podcast/2020/12/19/test-entry.adoc \ src/content/en/screencast/2021/02/07/autoqemu.adoc \ src/content/en/slide/2020/10/19/feature-flags.adoc \ src/content/en/slide/2020/11/14/local-first-hype.adoc \ src/content/en/til/2020/08/12/filename-timestamp.adoc \ src/content/en/til/2020/08/13/code-jekyll.adoc \ src/content/en/til/2020/08/14/browse-git.adoc \ src/content/en/til/2020/08/16/git-search.adoc \ src/content/en/til/2020/08/28/grep-online.adoc \ src/content/en/til/2020/09/04/cli-email-fun-profit.adoc \ src/content/en/til/2020/09/05/oldschool-pr.adoc \ src/content/en/til/2020/10/11/search-git-history.adoc \ src/content/en/til/2020/11/08/find-broken-symlink.adoc \ src/content/en/til/2020/11/12/diy-nix-bash-ci.adoc \ src/content/en/til/2020/11/12/git-bisect-automation.adoc \ src/content/en/til/2020/11/12/useful-bashvars.adoc \ src/content/en/til/2020/11/14/gpodder-media.adoc \ src/content/en/til/2020/11/30/git-notes-ci.adoc \ src/content/en/til/2020/12/15/shellcheck-repo.adoc \ src/content/en/til/2020/12/29/svg.adoc \ src/content/en/til/2021/01/12/curl-awk-emails.adoc \ src/content/en/til/2021/01/17/posix-shebang.adoc \ src/content/en/til/2021/04/24/cl-generic-precedence.adoc \ src/content/en/til/2021/04/24/clojure-autocurry.adoc \ src/content/en/til/2021/04/24/scm-nif.adoc \ src/content/en/til/2021/07/23/git-tls-gpg.adoc \ src/content/en/til/2021/08/11/js-bigint-reviver.adoc \ src/content/en/til/2026/09/05/multiline-sh-comments.adoc \ src/content/pt/hea/2020/08/12/arquivo-datado.adoc \ slides.eslaides = \ src/content/en/slide/2020/10/19/feature-flags.eslaides \ src/content/en/slide/2020/11/14/local-first-hype.eslaides \ categories.adoc = \ src/content/en/blog/categories.adoc \ src/content/en/pastebin/categories.adoc \ src/content/en/podcast/categories.adoc \ src/content/en/screencast/categories.adoc \ src/content/en/slide/categories.adoc \ src/content/en/til/categories.adoc \ src/content/pt/hea/categorias.adoc \ indexes.adoc = \ src/content/en/blog/index.adoc \ src/content/en/pastebin/index.adoc \ src/content/en/podcast/index.adoc \ src/content/en/screencast/index.adoc \ src/content/en/slide/index.adoc \ src/content/en/til/index.adoc \ src/content/pt/hea/index.adoc \ feeds.xml = \ src/content/en/blog/feed.xml \ src/content/en/pastebin/feed.xml \ src/content/en/podcast/feed.xml \ src/content/en/screencast/feed.xml \ src/content/en/slide/feed.xml \ src/content/en/til/feed.xml \ src/content/pt/hea/feed.xml \ images.svg = \ src/content/img/atom.svg \ src/content/img/envelope.svg \ src/content/img/favicon.svg \ src/content/img/link.svg \ src/content/img/lock.svg \ src/content/img/logo.svg \ src/content/img/monogram-filled.svg \ src/content/img/thumb.svg \ src/content/img/wordmark-filled.svg \ src/content/img/wordmark.svg \ sources.media = \ src/content/en/podcast/2020/12/19/test-entry.flac \ src/content/en/podcast/2020/12/19/test-entry.ogg \ src/content/en/screencast/2021/02/07/autoqemu.webm \ sources.tarballs = \ src/content/en/blog/2020/10/05/cargo2nix-demo.tar.gz \ src/content/en/blog/2020/10/05/cargo2nix.tar.gz \ src/content/en/blog/2020/10/05/swift2nix-demo.tar.gz \ src/content/en/blog/2020/10/05/swift2nix.tar.gz \ src/content/en/blog/2021/02/17/fallible.tar.gz \ src/content/en/screencast/2021/02/07/autoqemu.tar.gz \ sources.extras = \ src/content/en/blog/2020/10/05/cargo2nix-demo.tar.gz \ src/content/en/blog/2020/10/05/cargo2nix.tar.gz \ src/content/en/blog/2020/10/05/swift2nix-demo.tar.gz \ src/content/en/blog/2020/10/05/swift2nix.tar.gz \ src/content/en/blog/2021/02/17/fallible.tar.gz \ src/content/en/podcast/2020/12/19/test-entry.flac \ src/content/en/podcast/2020/12/19/test-entry.ogg \ src/content/en/screencast/2021/02/07/autoqemu.tar.gz \ src/content/en/screencast/2021/02/07/autoqemu.webm \ src/content/l/multiline-sh \ sources.po = \ po/en.po \ po/eo.po \ po/es.po \ po/euandre.org.pot \ po/fr.po \ po/pt.po \ music.ly = \ music.ogg = \ music.include = \ src/content/l/multiline-sh: src/content/en/til/2026/09/05/multiline-sh-comments.html root.dir = src/content comments.archives = src/comments.mastodon.json src/comments.lemmy.json comments.dir = src/comments comments.map = src/comments.txt img.dir = img src/content/en/about.htmlbody src/content/en/about.snippets src/content/en/about.json: src/content/en/about.adoc src/content/eo/pri.htmlbody src/content/eo/pri.snippets src/content/eo/pri.json: src/content/eo/pri.adoc src/content/es/acerca.htmlbody src/content/es/acerca.snippets src/content/es/acerca.json: src/content/es/acerca.adoc src/content/fr/a-propos.htmlbody src/content/fr/a-propos.snippets src/content/fr/a-propos.json: src/content/fr/a-propos.adoc src/content/pt/sobre.htmlbody src/content/pt/sobre.snippets src/content/pt/sobre.json: src/content/pt/sobre.adoc src/content/en/blog/2018/07/17/guix-nixos.htmlbody src/content/en/blog/2018/07/17/guix-nixos.snippets src/content/en/blog/2018/07/17/guix-nixos.json: src/content/en/blog/2018/07/17/guix-nixos.adoc src/content/en/blog/2018/08/01/npm-ci-reproducibility.htmlbody src/content/en/blog/2018/08/01/npm-ci-reproducibility.snippets src/content/en/blog/2018/08/01/npm-ci-reproducibility.json: src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc src/content/en/blog/2018/12/21/ytdl-subs.htmlbody src/content/en/blog/2018/12/21/ytdl-subs.snippets src/content/en/blog/2018/12/21/ytdl-subs.json: src/content/en/blog/2018/12/21/ytdl-subs.adoc src/content/en/blog/2019/06/02/nixos-stateless-workstation.htmlbody src/content/en/blog/2019/06/02/nixos-stateless-workstation.snippets src/content/en/blog/2019/06/02/nixos-stateless-workstation.json: src/content/en/blog/2019/06/02/nixos-stateless-workstation.adoc src/content/en/blog/2020/08/10/guix-srht.htmlbody src/content/en/blog/2020/08/10/guix-srht.snippets src/content/en/blog/2020/08/10/guix-srht.json: src/content/en/blog/2020/08/10/guix-srht.adoc src/content/en/blog/2020/08/31/database-i-wish-i-had.htmlbody src/content/en/blog/2020/08/31/database-i-wish-i-had.snippets src/content/en/blog/2020/08/31/database-i-wish-i-had.json: src/content/en/blog/2020/08/31/database-i-wish-i-had.adoc src/content/en/blog/2020/10/05/cargo2nix.htmlbody src/content/en/blog/2020/10/05/cargo2nix.snippets src/content/en/blog/2020/10/05/cargo2nix.json: src/content/en/blog/2020/10/05/cargo2nix.adoc src/content/en/blog/2020/10/05/swift2nix.htmlbody src/content/en/blog/2020/10/05/swift2nix.snippets src/content/en/blog/2020/10/05/swift2nix.json: src/content/en/blog/2020/10/05/swift2nix.adoc src/content/en/blog/2020/10/19/feature-flags.htmlbody src/content/en/blog/2020/10/19/feature-flags.snippets src/content/en/blog/2020/10/19/feature-flags.json: src/content/en/blog/2020/10/19/feature-flags.adoc src/content/en/blog/2020/10/20/wrong-interviewing.htmlbody src/content/en/blog/2020/10/20/wrong-interviewing.snippets src/content/en/blog/2020/10/20/wrong-interviewing.json: src/content/en/blog/2020/10/20/wrong-interviewing.adoc src/content/en/blog/2020/11/07/diy-bugs.htmlbody src/content/en/blog/2020/11/07/diy-bugs.snippets src/content/en/blog/2020/11/07/diy-bugs.json: src/content/en/blog/2020/11/07/diy-bugs.adoc src/content/en/blog/2020/11/08/paradigm-shift-review.htmlbody src/content/en/blog/2020/11/08/paradigm-shift-review.snippets src/content/en/blog/2020/11/08/paradigm-shift-review.json: src/content/en/blog/2020/11/08/paradigm-shift-review.adoc src/content/en/blog/2020/11/12/database-parsers-trees.htmlbody src/content/en/blog/2020/11/12/database-parsers-trees.snippets src/content/en/blog/2020/11/12/database-parsers-trees.json: src/content/en/blog/2020/11/12/database-parsers-trees.adoc src/content/en/blog/2020/11/14/local-first-review.htmlbody src/content/en/blog/2020/11/14/local-first-review.snippets src/content/en/blog/2020/11/14/local-first-review.json: src/content/en/blog/2020/11/14/local-first-review.adoc src/content/en/blog/2021/01/26/remembering-ann.htmlbody src/content/en/blog/2021/01/26/remembering-ann.snippets src/content/en/blog/2021/01/26/remembering-ann.json: src/content/en/blog/2021/01/26/remembering-ann.adoc src/content/en/blog/2021/02/17/fallible.htmlbody src/content/en/blog/2021/02/17/fallible.snippets src/content/en/blog/2021/02/17/fallible.json: src/content/en/blog/2021/02/17/fallible.adoc src/content/en/blog/2021/04/29/relational-review.htmlbody src/content/en/blog/2021/04/29/relational-review.snippets src/content/en/blog/2021/04/29/relational-review.json: src/content/en/blog/2021/04/29/relational-review.adoc src/content/en/pastebin/2016/04/05/rpn.htmlbody src/content/en/pastebin/2016/04/05/rpn.snippets src/content/en/pastebin/2016/04/05/rpn.json: src/content/en/pastebin/2016/04/05/rpn.adoc src/content/en/pastebin/2018/07/11/nix-pinning.htmlbody src/content/en/pastebin/2018/07/11/nix-pinning.snippets src/content/en/pastebin/2018/07/11/nix-pinning.json: src/content/en/pastebin/2018/07/11/nix-pinning.adoc src/content/en/pastebin/2018/07/13/guix-nixos-systemd.htmlbody src/content/en/pastebin/2018/07/13/guix-nixos-systemd.snippets src/content/en/pastebin/2018/07/13/guix-nixos-systemd.json: src/content/en/pastebin/2018/07/13/guix-nixos-systemd.adoc src/content/en/pastebin/2018/07/13/guixbuilder-nixos.htmlbody src/content/en/pastebin/2018/07/13/guixbuilder-nixos.snippets src/content/en/pastebin/2018/07/13/guixbuilder-nixos.json: src/content/en/pastebin/2018/07/13/guixbuilder-nixos.adoc src/content/en/pastebin/2018/07/13/guixbuilder.htmlbody src/content/en/pastebin/2018/07/13/guixbuilder.snippets src/content/en/pastebin/2018/07/13/guixbuilder.json: src/content/en/pastebin/2018/07/13/guixbuilder.adoc src/content/en/pastebin/2018/07/13/nix-strpad.htmlbody src/content/en/pastebin/2018/07/13/nix-strpad.snippets src/content/en/pastebin/2018/07/13/nix-strpad.json: src/content/en/pastebin/2018/07/13/nix-strpad.adoc src/content/en/pastebin/2018/07/25/nix-exps.htmlbody src/content/en/pastebin/2018/07/25/nix-exps.snippets src/content/en/pastebin/2018/07/25/nix-exps.json: src/content/en/pastebin/2018/07/25/nix-exps.adoc src/content/en/pastebin/2018/07/25/nix-showdrv.htmlbody src/content/en/pastebin/2018/07/25/nix-showdrv.snippets src/content/en/pastebin/2018/07/25/nix-showdrv.json: src/content/en/pastebin/2018/07/25/nix-showdrv.adoc src/content/en/pastebin/2019/06/08/inconsistent-hash.htmlbody src/content/en/pastebin/2019/06/08/inconsistent-hash.snippets src/content/en/pastebin/2019/06/08/inconsistent-hash.json: src/content/en/pastebin/2019/06/08/inconsistent-hash.adoc src/content/en/pastebin/2019/12/29/raku-tuple-type.htmlbody src/content/en/pastebin/2019/12/29/raku-tuple-type.snippets src/content/en/pastebin/2019/12/29/raku-tuple-type.json: src/content/en/pastebin/2019/12/29/raku-tuple-type.adoc src/content/en/pastebin/2020/01/04/guix-import-failure.htmlbody src/content/en/pastebin/2020/01/04/guix-import-failure.snippets src/content/en/pastebin/2020/01/04/guix-import-failure.json: src/content/en/pastebin/2020/01/04/guix-import-failure.adoc src/content/en/pastebin/2020/02/14/guix-shebang.htmlbody src/content/en/pastebin/2020/02/14/guix-shebang.snippets src/content/en/pastebin/2020/02/14/guix-shebang.json: src/content/en/pastebin/2020/02/14/guix-shebang.adoc src/content/en/pastebin/2020/11/27/guix-build-local.htmlbody src/content/en/pastebin/2020/11/27/guix-build-local.snippets src/content/en/pastebin/2020/11/27/guix-build-local.json: src/content/en/pastebin/2020/11/27/guix-build-local.adoc src/content/en/pastebin/2020/12/15/guix-pack-fail.htmlbody src/content/en/pastebin/2020/12/15/guix-pack-fail.snippets src/content/en/pastebin/2020/12/15/guix-pack-fail.json: src/content/en/pastebin/2020/12/15/guix-pack-fail.adoc src/content/en/pastebin/2021/04/03/naive-slugify-js.htmlbody src/content/en/pastebin/2021/04/03/naive-slugify-js.snippets src/content/en/pastebin/2021/04/03/naive-slugify-js.json: src/content/en/pastebin/2021/04/03/naive-slugify-js.adoc src/content/en/pastebin/2021/06/08/reading-session-pt1.htmlbody src/content/en/pastebin/2021/06/08/reading-session-pt1.snippets src/content/en/pastebin/2021/06/08/reading-session-pt1.json: src/content/en/pastebin/2021/06/08/reading-session-pt1.adoc src/content/en/pastebin/2021/06/22/curl-wget.htmlbody src/content/en/pastebin/2021/06/22/curl-wget.snippets src/content/en/pastebin/2021/06/22/curl-wget.json: src/content/en/pastebin/2021/06/22/curl-wget.adoc src/content/en/pastebin/2021/08/11/h1-spacing.htmlbody src/content/en/pastebin/2021/08/11/h1-spacing.snippets src/content/en/pastebin/2021/08/11/h1-spacing.json: src/content/en/pastebin/2021/08/11/h1-spacing.adoc src/content/en/pastebin/2021/09/02/sicp-3-19.htmlbody src/content/en/pastebin/2021/09/02/sicp-3-19.snippets src/content/en/pastebin/2021/09/02/sicp-3-19.json: src/content/en/pastebin/2021/09/02/sicp-3-19.adoc src/content/en/pastebin/2021/09/03/sicp-persistent-queue.htmlbody src/content/en/pastebin/2021/09/03/sicp-persistent-queue.snippets src/content/en/pastebin/2021/09/03/sicp-persistent-queue.json: src/content/en/pastebin/2021/09/03/sicp-persistent-queue.adoc src/content/en/pastebin/2022/07/14/git-cleanup.htmlbody src/content/en/pastebin/2022/07/14/git-cleanup.snippets src/content/en/pastebin/2022/07/14/git-cleanup.json: src/content/en/pastebin/2022/07/14/git-cleanup.adoc src/content/en/pastebin/2023/07/22/funcallable-amop.htmlbody src/content/en/pastebin/2023/07/22/funcallable-amop.snippets src/content/en/pastebin/2023/07/22/funcallable-amop.json: src/content/en/pastebin/2023/07/22/funcallable-amop.adoc src/content/en/podcast/2020/12/19/test-entry.htmlbody src/content/en/podcast/2020/12/19/test-entry.snippets src/content/en/podcast/2020/12/19/test-entry.json: src/content/en/podcast/2020/12/19/test-entry.adoc src/content/en/screencast/2021/02/07/autoqemu.htmlbody src/content/en/screencast/2021/02/07/autoqemu.snippets src/content/en/screencast/2021/02/07/autoqemu.json: src/content/en/screencast/2021/02/07/autoqemu.adoc src/content/en/slide/2020/10/19/feature-flags.htmlbody src/content/en/slide/2020/10/19/feature-flags.snippets src/content/en/slide/2020/10/19/feature-flags.json: src/content/en/slide/2020/10/19/feature-flags.adoc src/content/en/slide/2020/11/14/local-first-hype.htmlbody src/content/en/slide/2020/11/14/local-first-hype.snippets src/content/en/slide/2020/11/14/local-first-hype.json: src/content/en/slide/2020/11/14/local-first-hype.adoc src/content/en/til/2020/08/12/filename-timestamp.htmlbody src/content/en/til/2020/08/12/filename-timestamp.snippets src/content/en/til/2020/08/12/filename-timestamp.json: src/content/en/til/2020/08/12/filename-timestamp.adoc src/content/en/til/2020/08/13/code-jekyll.htmlbody src/content/en/til/2020/08/13/code-jekyll.snippets src/content/en/til/2020/08/13/code-jekyll.json: src/content/en/til/2020/08/13/code-jekyll.adoc src/content/en/til/2020/08/14/browse-git.htmlbody src/content/en/til/2020/08/14/browse-git.snippets src/content/en/til/2020/08/14/browse-git.json: src/content/en/til/2020/08/14/browse-git.adoc src/content/en/til/2020/08/16/git-search.htmlbody src/content/en/til/2020/08/16/git-search.snippets src/content/en/til/2020/08/16/git-search.json: src/content/en/til/2020/08/16/git-search.adoc src/content/en/til/2020/08/28/grep-online.htmlbody src/content/en/til/2020/08/28/grep-online.snippets src/content/en/til/2020/08/28/grep-online.json: src/content/en/til/2020/08/28/grep-online.adoc src/content/en/til/2020/09/04/cli-email-fun-profit.htmlbody src/content/en/til/2020/09/04/cli-email-fun-profit.snippets src/content/en/til/2020/09/04/cli-email-fun-profit.json: src/content/en/til/2020/09/04/cli-email-fun-profit.adoc src/content/en/til/2020/09/05/oldschool-pr.htmlbody src/content/en/til/2020/09/05/oldschool-pr.snippets src/content/en/til/2020/09/05/oldschool-pr.json: src/content/en/til/2020/09/05/oldschool-pr.adoc src/content/en/til/2020/10/11/search-git-history.htmlbody src/content/en/til/2020/10/11/search-git-history.snippets src/content/en/til/2020/10/11/search-git-history.json: src/content/en/til/2020/10/11/search-git-history.adoc src/content/en/til/2020/11/08/find-broken-symlink.htmlbody src/content/en/til/2020/11/08/find-broken-symlink.snippets src/content/en/til/2020/11/08/find-broken-symlink.json: src/content/en/til/2020/11/08/find-broken-symlink.adoc src/content/en/til/2020/11/12/diy-nix-bash-ci.htmlbody src/content/en/til/2020/11/12/diy-nix-bash-ci.snippets src/content/en/til/2020/11/12/diy-nix-bash-ci.json: src/content/en/til/2020/11/12/diy-nix-bash-ci.adoc src/content/en/til/2020/11/12/git-bisect-automation.htmlbody src/content/en/til/2020/11/12/git-bisect-automation.snippets src/content/en/til/2020/11/12/git-bisect-automation.json: src/content/en/til/2020/11/12/git-bisect-automation.adoc src/content/en/til/2020/11/12/useful-bashvars.htmlbody src/content/en/til/2020/11/12/useful-bashvars.snippets src/content/en/til/2020/11/12/useful-bashvars.json: src/content/en/til/2020/11/12/useful-bashvars.adoc src/content/en/til/2020/11/14/gpodder-media.htmlbody src/content/en/til/2020/11/14/gpodder-media.snippets src/content/en/til/2020/11/14/gpodder-media.json: src/content/en/til/2020/11/14/gpodder-media.adoc src/content/en/til/2020/11/30/git-notes-ci.htmlbody src/content/en/til/2020/11/30/git-notes-ci.snippets src/content/en/til/2020/11/30/git-notes-ci.json: src/content/en/til/2020/11/30/git-notes-ci.adoc src/content/en/til/2020/12/15/shellcheck-repo.htmlbody src/content/en/til/2020/12/15/shellcheck-repo.snippets src/content/en/til/2020/12/15/shellcheck-repo.json: src/content/en/til/2020/12/15/shellcheck-repo.adoc src/content/en/til/2020/12/29/svg.htmlbody src/content/en/til/2020/12/29/svg.snippets src/content/en/til/2020/12/29/svg.json: src/content/en/til/2020/12/29/svg.adoc src/content/en/til/2021/01/12/curl-awk-emails.htmlbody src/content/en/til/2021/01/12/curl-awk-emails.snippets src/content/en/til/2021/01/12/curl-awk-emails.json: src/content/en/til/2021/01/12/curl-awk-emails.adoc src/content/en/til/2021/01/17/posix-shebang.htmlbody src/content/en/til/2021/01/17/posix-shebang.snippets src/content/en/til/2021/01/17/posix-shebang.json: src/content/en/til/2021/01/17/posix-shebang.adoc src/content/en/til/2021/04/24/cl-generic-precedence.htmlbody src/content/en/til/2021/04/24/cl-generic-precedence.snippets src/content/en/til/2021/04/24/cl-generic-precedence.json: src/content/en/til/2021/04/24/cl-generic-precedence.adoc src/content/en/til/2021/04/24/clojure-autocurry.htmlbody src/content/en/til/2021/04/24/clojure-autocurry.snippets src/content/en/til/2021/04/24/clojure-autocurry.json: src/content/en/til/2021/04/24/clojure-autocurry.adoc src/content/en/til/2021/04/24/scm-nif.htmlbody src/content/en/til/2021/04/24/scm-nif.snippets src/content/en/til/2021/04/24/scm-nif.json: src/content/en/til/2021/04/24/scm-nif.adoc src/content/en/til/2021/07/23/git-tls-gpg.htmlbody src/content/en/til/2021/07/23/git-tls-gpg.snippets src/content/en/til/2021/07/23/git-tls-gpg.json: src/content/en/til/2021/07/23/git-tls-gpg.adoc src/content/en/til/2021/08/11/js-bigint-reviver.htmlbody src/content/en/til/2021/08/11/js-bigint-reviver.snippets src/content/en/til/2021/08/11/js-bigint-reviver.json: src/content/en/til/2021/08/11/js-bigint-reviver.adoc src/content/en/til/2026/09/05/multiline-sh-comments.htmlbody src/content/en/til/2026/09/05/multiline-sh-comments.snippets src/content/en/til/2026/09/05/multiline-sh-comments.json: src/content/en/til/2026/09/05/multiline-sh-comments.adoc src/content/pt/hea/2020/08/12/arquivo-datado.htmlbody src/content/pt/hea/2020/08/12/arquivo-datado.snippets src/content/pt/hea/2020/08/12/arquivo-datado.json: src/content/pt/hea/2020/08/12/arquivo-datado.adoc src/content/en/blog/index.htmlbody src/content/en/blog/index.snippets src/content/en/blog/index.json: src/content/en/blog/index.adoc src/content/en/pastebin/index.htmlbody src/content/en/pastebin/index.snippets src/content/en/pastebin/index.json: src/content/en/pastebin/index.adoc src/content/en/podcast/index.htmlbody src/content/en/podcast/index.snippets src/content/en/podcast/index.json: src/content/en/podcast/index.adoc src/content/en/screencast/index.htmlbody src/content/en/screencast/index.snippets src/content/en/screencast/index.json: src/content/en/screencast/index.adoc src/content/en/slide/index.htmlbody src/content/en/slide/index.snippets src/content/en/slide/index.json: src/content/en/slide/index.adoc src/content/en/til/index.htmlbody src/content/en/til/index.snippets src/content/en/til/index.json: src/content/en/til/index.adoc src/content/pt/hea/index.htmlbody src/content/pt/hea/index.snippets src/content/pt/hea/index.json: src/content/pt/hea/index.adoc src/content/en/blog/categories.htmlbody src/content/en/blog/categories.snippets src/content/en/blog/categories.json: src/content/en/blog/categories.adoc src/content/en/pastebin/categories.htmlbody src/content/en/pastebin/categories.snippets src/content/en/pastebin/categories.json: src/content/en/pastebin/categories.adoc src/content/en/podcast/categories.htmlbody src/content/en/podcast/categories.snippets src/content/en/podcast/categories.json: src/content/en/podcast/categories.adoc src/content/en/screencast/categories.htmlbody src/content/en/screencast/categories.snippets src/content/en/screencast/categories.json: src/content/en/screencast/categories.adoc src/content/en/slide/categories.htmlbody src/content/en/slide/categories.snippets src/content/en/slide/categories.json: src/content/en/slide/categories.adoc src/content/en/til/categories.htmlbody src/content/en/til/categories.snippets src/content/en/til/categories.json: src/content/en/til/categories.adoc src/content/pt/hea/categorias.htmlbody src/content/pt/hea/categorias.snippets src/content/pt/hea/categorias.json: src/content/pt/hea/categorias.adoc src/content/en/index.htmlbody src/content/en/index.snippets src/content/en/index.json: src/content/en/index.adoc src/content/eo/index.htmlbody src/content/eo/index.snippets src/content/eo/index.json: src/content/eo/index.adoc src/content/es/index.htmlbody src/content/es/index.snippets src/content/es/index.json: src/content/es/index.adoc src/content/fr/index.htmlbody src/content/fr/index.snippets src/content/fr/index.json: src/content/fr/index.adoc src/content/pt/index.htmlbody src/content/pt/index.snippets src/content/pt/index.json: src/content/pt/index.adoc src/content/en/about.html: src/content/en/about.json src/content/en/about.htmlbody src/content/eo/pri.html: src/content/eo/pri.json src/content/eo/pri.htmlbody src/content/es/acerca.html: src/content/es/acerca.json src/content/es/acerca.htmlbody src/content/fr/a-propos.html: src/content/fr/a-propos.json src/content/fr/a-propos.htmlbody src/content/pt/sobre.html: src/content/pt/sobre.json src/content/pt/sobre.htmlbody src/content/en/blog/2018/07/17/guix-nixos.html: src/content/en/blog/2018/07/17/guix-nixos.json src/content/en/blog/2018/07/17/guix-nixos.htmlbody src/content/en/blog/2018/08/01/npm-ci-reproducibility.html: src/content/en/blog/2018/08/01/npm-ci-reproducibility.json src/content/en/blog/2018/08/01/npm-ci-reproducibility.htmlbody src/content/en/blog/2018/12/21/ytdl-subs.html: src/content/en/blog/2018/12/21/ytdl-subs.json src/content/en/blog/2018/12/21/ytdl-subs.htmlbody src/content/en/blog/2019/06/02/nixos-stateless-workstation.html: src/content/en/blog/2019/06/02/nixos-stateless-workstation.json src/content/en/blog/2019/06/02/nixos-stateless-workstation.htmlbody src/content/en/blog/2020/08/10/guix-srht.html: src/content/en/blog/2020/08/10/guix-srht.json src/content/en/blog/2020/08/10/guix-srht.htmlbody src/content/en/blog/2020/08/31/database-i-wish-i-had.html: src/content/en/blog/2020/08/31/database-i-wish-i-had.json src/content/en/blog/2020/08/31/database-i-wish-i-had.htmlbody src/content/en/blog/2020/10/05/cargo2nix.html: src/content/en/blog/2020/10/05/cargo2nix.json src/content/en/blog/2020/10/05/cargo2nix.htmlbody src/content/en/blog/2020/10/05/swift2nix.html: src/content/en/blog/2020/10/05/swift2nix.json src/content/en/blog/2020/10/05/swift2nix.htmlbody src/content/en/blog/2020/10/19/feature-flags.html: src/content/en/blog/2020/10/19/feature-flags.json src/content/en/blog/2020/10/19/feature-flags.htmlbody src/content/en/blog/2020/10/20/wrong-interviewing.html: src/content/en/blog/2020/10/20/wrong-interviewing.json src/content/en/blog/2020/10/20/wrong-interviewing.htmlbody src/content/en/blog/2020/11/07/diy-bugs.html: src/content/en/blog/2020/11/07/diy-bugs.json src/content/en/blog/2020/11/07/diy-bugs.htmlbody src/content/en/blog/2020/11/08/paradigm-shift-review.html: src/content/en/blog/2020/11/08/paradigm-shift-review.json src/content/en/blog/2020/11/08/paradigm-shift-review.htmlbody src/content/en/blog/2020/11/12/database-parsers-trees.html: src/content/en/blog/2020/11/12/database-parsers-trees.json src/content/en/blog/2020/11/12/database-parsers-trees.htmlbody src/content/en/blog/2020/11/14/local-first-review.html: src/content/en/blog/2020/11/14/local-first-review.json src/content/en/blog/2020/11/14/local-first-review.htmlbody src/content/en/blog/2021/01/26/remembering-ann.html: src/content/en/blog/2021/01/26/remembering-ann.json src/content/en/blog/2021/01/26/remembering-ann.htmlbody src/content/en/blog/2021/02/17/fallible.html: src/content/en/blog/2021/02/17/fallible.json src/content/en/blog/2021/02/17/fallible.htmlbody src/content/en/blog/2021/04/29/relational-review.html: src/content/en/blog/2021/04/29/relational-review.json src/content/en/blog/2021/04/29/relational-review.htmlbody src/content/en/pastebin/2016/04/05/rpn.html: src/content/en/pastebin/2016/04/05/rpn.json src/content/en/pastebin/2016/04/05/rpn.htmlbody src/content/en/pastebin/2018/07/11/nix-pinning.html: src/content/en/pastebin/2018/07/11/nix-pinning.json src/content/en/pastebin/2018/07/11/nix-pinning.htmlbody src/content/en/pastebin/2018/07/13/guix-nixos-systemd.html: src/content/en/pastebin/2018/07/13/guix-nixos-systemd.json src/content/en/pastebin/2018/07/13/guix-nixos-systemd.htmlbody src/content/en/pastebin/2018/07/13/guixbuilder-nixos.html: src/content/en/pastebin/2018/07/13/guixbuilder-nixos.json src/content/en/pastebin/2018/07/13/guixbuilder-nixos.htmlbody src/content/en/pastebin/2018/07/13/guixbuilder.html: src/content/en/pastebin/2018/07/13/guixbuilder.json src/content/en/pastebin/2018/07/13/guixbuilder.htmlbody src/content/en/pastebin/2018/07/13/nix-strpad.html: src/content/en/pastebin/2018/07/13/nix-strpad.json src/content/en/pastebin/2018/07/13/nix-strpad.htmlbody src/content/en/pastebin/2018/07/25/nix-exps.html: src/content/en/pastebin/2018/07/25/nix-exps.json src/content/en/pastebin/2018/07/25/nix-exps.htmlbody src/content/en/pastebin/2018/07/25/nix-showdrv.html: src/content/en/pastebin/2018/07/25/nix-showdrv.json src/content/en/pastebin/2018/07/25/nix-showdrv.htmlbody src/content/en/pastebin/2019/06/08/inconsistent-hash.html: src/content/en/pastebin/2019/06/08/inconsistent-hash.json src/content/en/pastebin/2019/06/08/inconsistent-hash.htmlbody src/content/en/pastebin/2019/12/29/raku-tuple-type.html: src/content/en/pastebin/2019/12/29/raku-tuple-type.json src/content/en/pastebin/2019/12/29/raku-tuple-type.htmlbody src/content/en/pastebin/2020/01/04/guix-import-failure.html: src/content/en/pastebin/2020/01/04/guix-import-failure.json src/content/en/pastebin/2020/01/04/guix-import-failure.htmlbody src/content/en/pastebin/2020/02/14/guix-shebang.html: src/content/en/pastebin/2020/02/14/guix-shebang.json src/content/en/pastebin/2020/02/14/guix-shebang.htmlbody src/content/en/pastebin/2020/11/27/guix-build-local.html: src/content/en/pastebin/2020/11/27/guix-build-local.json src/content/en/pastebin/2020/11/27/guix-build-local.htmlbody src/content/en/pastebin/2020/12/15/guix-pack-fail.html: src/content/en/pastebin/2020/12/15/guix-pack-fail.json src/content/en/pastebin/2020/12/15/guix-pack-fail.htmlbody src/content/en/pastebin/2021/04/03/naive-slugify-js.html: src/content/en/pastebin/2021/04/03/naive-slugify-js.json src/content/en/pastebin/2021/04/03/naive-slugify-js.htmlbody src/content/en/pastebin/2021/06/08/reading-session-pt1.html: src/content/en/pastebin/2021/06/08/reading-session-pt1.json src/content/en/pastebin/2021/06/08/reading-session-pt1.htmlbody src/content/en/pastebin/2021/06/22/curl-wget.html: src/content/en/pastebin/2021/06/22/curl-wget.json src/content/en/pastebin/2021/06/22/curl-wget.htmlbody src/content/en/pastebin/2021/08/11/h1-spacing.html: src/content/en/pastebin/2021/08/11/h1-spacing.json src/content/en/pastebin/2021/08/11/h1-spacing.htmlbody src/content/en/pastebin/2021/09/02/sicp-3-19.html: src/content/en/pastebin/2021/09/02/sicp-3-19.json src/content/en/pastebin/2021/09/02/sicp-3-19.htmlbody src/content/en/pastebin/2021/09/03/sicp-persistent-queue.html: src/content/en/pastebin/2021/09/03/sicp-persistent-queue.json src/content/en/pastebin/2021/09/03/sicp-persistent-queue.htmlbody src/content/en/pastebin/2022/07/14/git-cleanup.html: src/content/en/pastebin/2022/07/14/git-cleanup.json src/content/en/pastebin/2022/07/14/git-cleanup.htmlbody src/content/en/pastebin/2023/07/22/funcallable-amop.html: src/content/en/pastebin/2023/07/22/funcallable-amop.json src/content/en/pastebin/2023/07/22/funcallable-amop.htmlbody src/content/en/podcast/2020/12/19/test-entry.html: src/content/en/podcast/2020/12/19/test-entry.json src/content/en/podcast/2020/12/19/test-entry.htmlbody src/content/en/screencast/2021/02/07/autoqemu.html: src/content/en/screencast/2021/02/07/autoqemu.json src/content/en/screencast/2021/02/07/autoqemu.htmlbody src/content/en/slide/2020/10/19/feature-flags.html: src/content/en/slide/2020/10/19/feature-flags.json src/content/en/slide/2020/10/19/feature-flags.htmlbody src/content/en/slide/2020/11/14/local-first-hype.html: src/content/en/slide/2020/11/14/local-first-hype.json src/content/en/slide/2020/11/14/local-first-hype.htmlbody src/content/en/til/2020/08/12/filename-timestamp.html: src/content/en/til/2020/08/12/filename-timestamp.json src/content/en/til/2020/08/12/filename-timestamp.htmlbody src/content/en/til/2020/08/13/code-jekyll.html: src/content/en/til/2020/08/13/code-jekyll.json src/content/en/til/2020/08/13/code-jekyll.htmlbody src/content/en/til/2020/08/14/browse-git.html: src/content/en/til/2020/08/14/browse-git.json src/content/en/til/2020/08/14/browse-git.htmlbody src/content/en/til/2020/08/16/git-search.html: src/content/en/til/2020/08/16/git-search.json src/content/en/til/2020/08/16/git-search.htmlbody src/content/en/til/2020/08/28/grep-online.html: src/content/en/til/2020/08/28/grep-online.json src/content/en/til/2020/08/28/grep-online.htmlbody src/content/en/til/2020/09/04/cli-email-fun-profit.html: src/content/en/til/2020/09/04/cli-email-fun-profit.json src/content/en/til/2020/09/04/cli-email-fun-profit.htmlbody src/content/en/til/2020/09/05/oldschool-pr.html: src/content/en/til/2020/09/05/oldschool-pr.json src/content/en/til/2020/09/05/oldschool-pr.htmlbody src/content/en/til/2020/10/11/search-git-history.html: src/content/en/til/2020/10/11/search-git-history.json src/content/en/til/2020/10/11/search-git-history.htmlbody src/content/en/til/2020/11/08/find-broken-symlink.html: src/content/en/til/2020/11/08/find-broken-symlink.json src/content/en/til/2020/11/08/find-broken-symlink.htmlbody src/content/en/til/2020/11/12/diy-nix-bash-ci.html: src/content/en/til/2020/11/12/diy-nix-bash-ci.json src/content/en/til/2020/11/12/diy-nix-bash-ci.htmlbody src/content/en/til/2020/11/12/git-bisect-automation.html: src/content/en/til/2020/11/12/git-bisect-automation.json src/content/en/til/2020/11/12/git-bisect-automation.htmlbody src/content/en/til/2020/11/12/useful-bashvars.html: src/content/en/til/2020/11/12/useful-bashvars.json src/content/en/til/2020/11/12/useful-bashvars.htmlbody src/content/en/til/2020/11/14/gpodder-media.html: src/content/en/til/2020/11/14/gpodder-media.json src/content/en/til/2020/11/14/gpodder-media.htmlbody src/content/en/til/2020/11/30/git-notes-ci.html: src/content/en/til/2020/11/30/git-notes-ci.json src/content/en/til/2020/11/30/git-notes-ci.htmlbody src/content/en/til/2020/12/15/shellcheck-repo.html: src/content/en/til/2020/12/15/shellcheck-repo.json src/content/en/til/2020/12/15/shellcheck-repo.htmlbody src/content/en/til/2020/12/29/svg.html: src/content/en/til/2020/12/29/svg.json src/content/en/til/2020/12/29/svg.htmlbody src/content/en/til/2021/01/12/curl-awk-emails.html: src/content/en/til/2021/01/12/curl-awk-emails.json src/content/en/til/2021/01/12/curl-awk-emails.htmlbody src/content/en/til/2021/01/17/posix-shebang.html: src/content/en/til/2021/01/17/posix-shebang.json src/content/en/til/2021/01/17/posix-shebang.htmlbody src/content/en/til/2021/04/24/cl-generic-precedence.html: src/content/en/til/2021/04/24/cl-generic-precedence.json src/content/en/til/2021/04/24/cl-generic-precedence.htmlbody src/content/en/til/2021/04/24/clojure-autocurry.html: src/content/en/til/2021/04/24/clojure-autocurry.json src/content/en/til/2021/04/24/clojure-autocurry.htmlbody src/content/en/til/2021/04/24/scm-nif.html: src/content/en/til/2021/04/24/scm-nif.json src/content/en/til/2021/04/24/scm-nif.htmlbody src/content/en/til/2021/07/23/git-tls-gpg.html: src/content/en/til/2021/07/23/git-tls-gpg.json src/content/en/til/2021/07/23/git-tls-gpg.htmlbody src/content/en/til/2021/08/11/js-bigint-reviver.html: src/content/en/til/2021/08/11/js-bigint-reviver.json src/content/en/til/2021/08/11/js-bigint-reviver.htmlbody src/content/en/til/2026/09/05/multiline-sh-comments.html: src/content/en/til/2026/09/05/multiline-sh-comments.json src/content/en/til/2026/09/05/multiline-sh-comments.htmlbody src/content/pt/hea/2020/08/12/arquivo-datado.html: src/content/pt/hea/2020/08/12/arquivo-datado.json src/content/pt/hea/2020/08/12/arquivo-datado.htmlbody src/content/en/blog/index.html: src/content/en/blog/index.json src/content/en/blog/index.htmlbody src/content/en/pastebin/index.html: src/content/en/pastebin/index.json src/content/en/pastebin/index.htmlbody src/content/en/podcast/index.html: src/content/en/podcast/index.json src/content/en/podcast/index.htmlbody src/content/en/screencast/index.html: src/content/en/screencast/index.json src/content/en/screencast/index.htmlbody src/content/en/slide/index.html: src/content/en/slide/index.json src/content/en/slide/index.htmlbody src/content/en/til/index.html: src/content/en/til/index.json src/content/en/til/index.htmlbody src/content/pt/hea/index.html: src/content/pt/hea/index.json src/content/pt/hea/index.htmlbody src/content/en/blog/categories.html: src/content/en/blog/categories.json src/content/en/blog/categories.htmlbody src/content/en/pastebin/categories.html: src/content/en/pastebin/categories.json src/content/en/pastebin/categories.htmlbody src/content/en/podcast/categories.html: src/content/en/podcast/categories.json src/content/en/podcast/categories.htmlbody src/content/en/screencast/categories.html: src/content/en/screencast/categories.json src/content/en/screencast/categories.htmlbody src/content/en/slide/categories.html: src/content/en/slide/categories.json src/content/en/slide/categories.htmlbody src/content/en/til/categories.html: src/content/en/til/categories.json src/content/en/til/categories.htmlbody src/content/pt/hea/categorias.html: src/content/pt/hea/categorias.json src/content/pt/hea/categorias.htmlbody src/content/en/index.html: src/content/en/index.json src/content/en/index.htmlbody src/content/eo/index.html: src/content/eo/index.json src/content/eo/index.htmlbody src/content/es/index.html: src/content/es/index.json src/content/es/index.htmlbody src/content/fr/index.html: src/content/fr/index.json src/content/fr/index.htmlbody src/content/pt/index.html: src/content/pt/index.json src/content/pt/index.htmlbody src/content/en/about.updatedat-check: src/content/en/about.json src/content/eo/pri.updatedat-check: src/content/eo/pri.json src/content/es/acerca.updatedat-check: src/content/es/acerca.json src/content/fr/a-propos.updatedat-check: src/content/fr/a-propos.json src/content/pt/sobre.updatedat-check: src/content/pt/sobre.json src/content/en/blog/2018/07/17/guix-nixos.updatedat-check: src/content/en/blog/2018/07/17/guix-nixos.json src/content/en/blog/2018/08/01/npm-ci-reproducibility.updatedat-check: src/content/en/blog/2018/08/01/npm-ci-reproducibility.json src/content/en/blog/2018/12/21/ytdl-subs.updatedat-check: src/content/en/blog/2018/12/21/ytdl-subs.json src/content/en/blog/2019/06/02/nixos-stateless-workstation.updatedat-check: src/content/en/blog/2019/06/02/nixos-stateless-workstation.json src/content/en/blog/2020/08/10/guix-srht.updatedat-check: src/content/en/blog/2020/08/10/guix-srht.json src/content/en/blog/2020/08/31/database-i-wish-i-had.updatedat-check: src/content/en/blog/2020/08/31/database-i-wish-i-had.json src/content/en/blog/2020/10/05/cargo2nix.updatedat-check: src/content/en/blog/2020/10/05/cargo2nix.json src/content/en/blog/2020/10/05/swift2nix.updatedat-check: src/content/en/blog/2020/10/05/swift2nix.json src/content/en/blog/2020/10/19/feature-flags.updatedat-check: src/content/en/blog/2020/10/19/feature-flags.json src/content/en/blog/2020/10/20/wrong-interviewing.updatedat-check: src/content/en/blog/2020/10/20/wrong-interviewing.json src/content/en/blog/2020/11/07/diy-bugs.updatedat-check: src/content/en/blog/2020/11/07/diy-bugs.json src/content/en/blog/2020/11/08/paradigm-shift-review.updatedat-check: src/content/en/blog/2020/11/08/paradigm-shift-review.json src/content/en/blog/2020/11/12/database-parsers-trees.updatedat-check: src/content/en/blog/2020/11/12/database-parsers-trees.json src/content/en/blog/2020/11/14/local-first-review.updatedat-check: src/content/en/blog/2020/11/14/local-first-review.json src/content/en/blog/2021/01/26/remembering-ann.updatedat-check: src/content/en/blog/2021/01/26/remembering-ann.json src/content/en/blog/2021/02/17/fallible.updatedat-check: src/content/en/blog/2021/02/17/fallible.json src/content/en/blog/2021/04/29/relational-review.updatedat-check: src/content/en/blog/2021/04/29/relational-review.json src/content/en/pastebin/2016/04/05/rpn.updatedat-check: src/content/en/pastebin/2016/04/05/rpn.json src/content/en/pastebin/2018/07/11/nix-pinning.updatedat-check: src/content/en/pastebin/2018/07/11/nix-pinning.json src/content/en/pastebin/2018/07/13/guix-nixos-systemd.updatedat-check: src/content/en/pastebin/2018/07/13/guix-nixos-systemd.json src/content/en/pastebin/2018/07/13/guixbuilder-nixos.updatedat-check: src/content/en/pastebin/2018/07/13/guixbuilder-nixos.json src/content/en/pastebin/2018/07/13/guixbuilder.updatedat-check: src/content/en/pastebin/2018/07/13/guixbuilder.json src/content/en/pastebin/2018/07/13/nix-strpad.updatedat-check: src/content/en/pastebin/2018/07/13/nix-strpad.json src/content/en/pastebin/2018/07/25/nix-exps.updatedat-check: src/content/en/pastebin/2018/07/25/nix-exps.json src/content/en/pastebin/2018/07/25/nix-showdrv.updatedat-check: src/content/en/pastebin/2018/07/25/nix-showdrv.json src/content/en/pastebin/2019/06/08/inconsistent-hash.updatedat-check: src/content/en/pastebin/2019/06/08/inconsistent-hash.json src/content/en/pastebin/2019/12/29/raku-tuple-type.updatedat-check: src/content/en/pastebin/2019/12/29/raku-tuple-type.json src/content/en/pastebin/2020/01/04/guix-import-failure.updatedat-check: src/content/en/pastebin/2020/01/04/guix-import-failure.json src/content/en/pastebin/2020/02/14/guix-shebang.updatedat-check: src/content/en/pastebin/2020/02/14/guix-shebang.json src/content/en/pastebin/2020/11/27/guix-build-local.updatedat-check: src/content/en/pastebin/2020/11/27/guix-build-local.json src/content/en/pastebin/2020/12/15/guix-pack-fail.updatedat-check: src/content/en/pastebin/2020/12/15/guix-pack-fail.json src/content/en/pastebin/2021/04/03/naive-slugify-js.updatedat-check: src/content/en/pastebin/2021/04/03/naive-slugify-js.json src/content/en/pastebin/2021/06/08/reading-session-pt1.updatedat-check: src/content/en/pastebin/2021/06/08/reading-session-pt1.json src/content/en/pastebin/2021/06/22/curl-wget.updatedat-check: src/content/en/pastebin/2021/06/22/curl-wget.json src/content/en/pastebin/2021/08/11/h1-spacing.updatedat-check: src/content/en/pastebin/2021/08/11/h1-spacing.json src/content/en/pastebin/2021/09/02/sicp-3-19.updatedat-check: src/content/en/pastebin/2021/09/02/sicp-3-19.json src/content/en/pastebin/2021/09/03/sicp-persistent-queue.updatedat-check: src/content/en/pastebin/2021/09/03/sicp-persistent-queue.json src/content/en/pastebin/2022/07/14/git-cleanup.updatedat-check: src/content/en/pastebin/2022/07/14/git-cleanup.json src/content/en/pastebin/2023/07/22/funcallable-amop.updatedat-check: src/content/en/pastebin/2023/07/22/funcallable-amop.json src/content/en/podcast/2020/12/19/test-entry.updatedat-check: src/content/en/podcast/2020/12/19/test-entry.json src/content/en/screencast/2021/02/07/autoqemu.updatedat-check: src/content/en/screencast/2021/02/07/autoqemu.json src/content/en/slide/2020/10/19/feature-flags.updatedat-check: src/content/en/slide/2020/10/19/feature-flags.json src/content/en/slide/2020/11/14/local-first-hype.updatedat-check: src/content/en/slide/2020/11/14/local-first-hype.json src/content/en/til/2020/08/12/filename-timestamp.updatedat-check: src/content/en/til/2020/08/12/filename-timestamp.json src/content/en/til/2020/08/13/code-jekyll.updatedat-check: src/content/en/til/2020/08/13/code-jekyll.json src/content/en/til/2020/08/14/browse-git.updatedat-check: src/content/en/til/2020/08/14/browse-git.json src/content/en/til/2020/08/16/git-search.updatedat-check: src/content/en/til/2020/08/16/git-search.json src/content/en/til/2020/08/28/grep-online.updatedat-check: src/content/en/til/2020/08/28/grep-online.json src/content/en/til/2020/09/04/cli-email-fun-profit.updatedat-check: src/content/en/til/2020/09/04/cli-email-fun-profit.json src/content/en/til/2020/09/05/oldschool-pr.updatedat-check: src/content/en/til/2020/09/05/oldschool-pr.json src/content/en/til/2020/10/11/search-git-history.updatedat-check: src/content/en/til/2020/10/11/search-git-history.json src/content/en/til/2020/11/08/find-broken-symlink.updatedat-check: src/content/en/til/2020/11/08/find-broken-symlink.json src/content/en/til/2020/11/12/diy-nix-bash-ci.updatedat-check: src/content/en/til/2020/11/12/diy-nix-bash-ci.json src/content/en/til/2020/11/12/git-bisect-automation.updatedat-check: src/content/en/til/2020/11/12/git-bisect-automation.json src/content/en/til/2020/11/12/useful-bashvars.updatedat-check: src/content/en/til/2020/11/12/useful-bashvars.json src/content/en/til/2020/11/14/gpodder-media.updatedat-check: src/content/en/til/2020/11/14/gpodder-media.json src/content/en/til/2020/11/30/git-notes-ci.updatedat-check: src/content/en/til/2020/11/30/git-notes-ci.json src/content/en/til/2020/12/15/shellcheck-repo.updatedat-check: src/content/en/til/2020/12/15/shellcheck-repo.json src/content/en/til/2020/12/29/svg.updatedat-check: src/content/en/til/2020/12/29/svg.json src/content/en/til/2021/01/12/curl-awk-emails.updatedat-check: src/content/en/til/2021/01/12/curl-awk-emails.json src/content/en/til/2021/01/17/posix-shebang.updatedat-check: src/content/en/til/2021/01/17/posix-shebang.json src/content/en/til/2021/04/24/cl-generic-precedence.updatedat-check: src/content/en/til/2021/04/24/cl-generic-precedence.json src/content/en/til/2021/04/24/clojure-autocurry.updatedat-check: src/content/en/til/2021/04/24/clojure-autocurry.json src/content/en/til/2021/04/24/scm-nif.updatedat-check: src/content/en/til/2021/04/24/scm-nif.json src/content/en/til/2021/07/23/git-tls-gpg.updatedat-check: src/content/en/til/2021/07/23/git-tls-gpg.json src/content/en/til/2021/08/11/js-bigint-reviver.updatedat-check: src/content/en/til/2021/08/11/js-bigint-reviver.json src/content/en/til/2026/09/05/multiline-sh-comments.updatedat-check: src/content/en/til/2026/09/05/multiline-sh-comments.json src/content/pt/hea/2020/08/12/arquivo-datado.updatedat-check: src/content/pt/hea/2020/08/12/arquivo-datado.json src/content/en/blog/index.updatedat-check: src/content/en/blog/index.json src/content/en/pastebin/index.updatedat-check: src/content/en/pastebin/index.json src/content/en/podcast/index.updatedat-check: src/content/en/podcast/index.json src/content/en/screencast/index.updatedat-check: src/content/en/screencast/index.json src/content/en/slide/index.updatedat-check: src/content/en/slide/index.json src/content/en/til/index.updatedat-check: src/content/en/til/index.json src/content/pt/hea/index.updatedat-check: src/content/pt/hea/index.json src/content/en/blog/categories.updatedat-check: src/content/en/blog/categories.json src/content/en/pastebin/categories.updatedat-check: src/content/en/pastebin/categories.json src/content/en/podcast/categories.updatedat-check: src/content/en/podcast/categories.json src/content/en/screencast/categories.updatedat-check: src/content/en/screencast/categories.json src/content/en/slide/categories.updatedat-check: src/content/en/slide/categories.json src/content/en/til/categories.updatedat-check: src/content/en/til/categories.json src/content/pt/hea/categorias.updatedat-check: src/content/pt/hea/categorias.json src/content/en/index.updatedat-check: src/content/en/index.json src/content/eo/index.updatedat-check: src/content/eo/index.json src/content/es/index.updatedat-check: src/content/es/index.json src/content/fr/index.updatedat-check: src/content/fr/index.json src/content/pt/index.updatedat-check: src/content/pt/index.json src/content/en/about.links-internal-check: src/content/en/about.links src/content/eo/pri.links-internal-check: src/content/eo/pri.links src/content/es/acerca.links-internal-check: src/content/es/acerca.links src/content/fr/a-propos.links-internal-check: src/content/fr/a-propos.links src/content/pt/sobre.links-internal-check: src/content/pt/sobre.links src/content/en/blog/2018/07/17/guix-nixos.links-internal-check: src/content/en/blog/2018/07/17/guix-nixos.links src/content/en/blog/2018/08/01/npm-ci-reproducibility.links-internal-check: src/content/en/blog/2018/08/01/npm-ci-reproducibility.links src/content/en/blog/2018/12/21/ytdl-subs.links-internal-check: src/content/en/blog/2018/12/21/ytdl-subs.links src/content/en/blog/2019/06/02/nixos-stateless-workstation.links-internal-check: src/content/en/blog/2019/06/02/nixos-stateless-workstation.links src/content/en/blog/2020/08/10/guix-srht.links-internal-check: src/content/en/blog/2020/08/10/guix-srht.links src/content/en/blog/2020/08/31/database-i-wish-i-had.links-internal-check: src/content/en/blog/2020/08/31/database-i-wish-i-had.links src/content/en/blog/2020/10/05/cargo2nix.links-internal-check: src/content/en/blog/2020/10/05/cargo2nix.links src/content/en/blog/2020/10/05/swift2nix.links-internal-check: src/content/en/blog/2020/10/05/swift2nix.links src/content/en/blog/2020/10/19/feature-flags.links-internal-check: src/content/en/blog/2020/10/19/feature-flags.links src/content/en/blog/2020/10/20/wrong-interviewing.links-internal-check: src/content/en/blog/2020/10/20/wrong-interviewing.links src/content/en/blog/2020/11/07/diy-bugs.links-internal-check: src/content/en/blog/2020/11/07/diy-bugs.links src/content/en/blog/2020/11/08/paradigm-shift-review.links-internal-check: src/content/en/blog/2020/11/08/paradigm-shift-review.links src/content/en/blog/2020/11/12/database-parsers-trees.links-internal-check: src/content/en/blog/2020/11/12/database-parsers-trees.links src/content/en/blog/2020/11/14/local-first-review.links-internal-check: src/content/en/blog/2020/11/14/local-first-review.links src/content/en/blog/2021/01/26/remembering-ann.links-internal-check: src/content/en/blog/2021/01/26/remembering-ann.links src/content/en/blog/2021/02/17/fallible.links-internal-check: src/content/en/blog/2021/02/17/fallible.links src/content/en/blog/2021/04/29/relational-review.links-internal-check: src/content/en/blog/2021/04/29/relational-review.links src/content/en/pastebin/2016/04/05/rpn.links-internal-check: src/content/en/pastebin/2016/04/05/rpn.links src/content/en/pastebin/2018/07/11/nix-pinning.links-internal-check: src/content/en/pastebin/2018/07/11/nix-pinning.links src/content/en/pastebin/2018/07/13/guix-nixos-systemd.links-internal-check: src/content/en/pastebin/2018/07/13/guix-nixos-systemd.links src/content/en/pastebin/2018/07/13/guixbuilder-nixos.links-internal-check: src/content/en/pastebin/2018/07/13/guixbuilder-nixos.links src/content/en/pastebin/2018/07/13/guixbuilder.links-internal-check: src/content/en/pastebin/2018/07/13/guixbuilder.links src/content/en/pastebin/2018/07/13/nix-strpad.links-internal-check: src/content/en/pastebin/2018/07/13/nix-strpad.links src/content/en/pastebin/2018/07/25/nix-exps.links-internal-check: src/content/en/pastebin/2018/07/25/nix-exps.links src/content/en/pastebin/2018/07/25/nix-showdrv.links-internal-check: src/content/en/pastebin/2018/07/25/nix-showdrv.links src/content/en/pastebin/2019/06/08/inconsistent-hash.links-internal-check: src/content/en/pastebin/2019/06/08/inconsistent-hash.links src/content/en/pastebin/2019/12/29/raku-tuple-type.links-internal-check: src/content/en/pastebin/2019/12/29/raku-tuple-type.links src/content/en/pastebin/2020/01/04/guix-import-failure.links-internal-check: src/content/en/pastebin/2020/01/04/guix-import-failure.links src/content/en/pastebin/2020/02/14/guix-shebang.links-internal-check: src/content/en/pastebin/2020/02/14/guix-shebang.links src/content/en/pastebin/2020/11/27/guix-build-local.links-internal-check: src/content/en/pastebin/2020/11/27/guix-build-local.links src/content/en/pastebin/2020/12/15/guix-pack-fail.links-internal-check: src/content/en/pastebin/2020/12/15/guix-pack-fail.links src/content/en/pastebin/2021/04/03/naive-slugify-js.links-internal-check: src/content/en/pastebin/2021/04/03/naive-slugify-js.links src/content/en/pastebin/2021/06/08/reading-session-pt1.links-internal-check: src/content/en/pastebin/2021/06/08/reading-session-pt1.links src/content/en/pastebin/2021/06/22/curl-wget.links-internal-check: src/content/en/pastebin/2021/06/22/curl-wget.links src/content/en/pastebin/2021/08/11/h1-spacing.links-internal-check: src/content/en/pastebin/2021/08/11/h1-spacing.links src/content/en/pastebin/2021/09/02/sicp-3-19.links-internal-check: src/content/en/pastebin/2021/09/02/sicp-3-19.links src/content/en/pastebin/2021/09/03/sicp-persistent-queue.links-internal-check: src/content/en/pastebin/2021/09/03/sicp-persistent-queue.links src/content/en/pastebin/2022/07/14/git-cleanup.links-internal-check: src/content/en/pastebin/2022/07/14/git-cleanup.links src/content/en/pastebin/2023/07/22/funcallable-amop.links-internal-check: src/content/en/pastebin/2023/07/22/funcallable-amop.links src/content/en/podcast/2020/12/19/test-entry.links-internal-check: src/content/en/podcast/2020/12/19/test-entry.links src/content/en/screencast/2021/02/07/autoqemu.links-internal-check: src/content/en/screencast/2021/02/07/autoqemu.links src/content/en/slide/2020/10/19/feature-flags.links-internal-check: src/content/en/slide/2020/10/19/feature-flags.links src/content/en/slide/2020/11/14/local-first-hype.links-internal-check: src/content/en/slide/2020/11/14/local-first-hype.links src/content/en/til/2020/08/12/filename-timestamp.links-internal-check: src/content/en/til/2020/08/12/filename-timestamp.links src/content/en/til/2020/08/13/code-jekyll.links-internal-check: src/content/en/til/2020/08/13/code-jekyll.links src/content/en/til/2020/08/14/browse-git.links-internal-check: src/content/en/til/2020/08/14/browse-git.links src/content/en/til/2020/08/16/git-search.links-internal-check: src/content/en/til/2020/08/16/git-search.links src/content/en/til/2020/08/28/grep-online.links-internal-check: src/content/en/til/2020/08/28/grep-online.links src/content/en/til/2020/09/04/cli-email-fun-profit.links-internal-check: src/content/en/til/2020/09/04/cli-email-fun-profit.links src/content/en/til/2020/09/05/oldschool-pr.links-internal-check: src/content/en/til/2020/09/05/oldschool-pr.links src/content/en/til/2020/10/11/search-git-history.links-internal-check: src/content/en/til/2020/10/11/search-git-history.links src/content/en/til/2020/11/08/find-broken-symlink.links-internal-check: src/content/en/til/2020/11/08/find-broken-symlink.links src/content/en/til/2020/11/12/diy-nix-bash-ci.links-internal-check: src/content/en/til/2020/11/12/diy-nix-bash-ci.links src/content/en/til/2020/11/12/git-bisect-automation.links-internal-check: src/content/en/til/2020/11/12/git-bisect-automation.links src/content/en/til/2020/11/12/useful-bashvars.links-internal-check: src/content/en/til/2020/11/12/useful-bashvars.links src/content/en/til/2020/11/14/gpodder-media.links-internal-check: src/content/en/til/2020/11/14/gpodder-media.links src/content/en/til/2020/11/30/git-notes-ci.links-internal-check: src/content/en/til/2020/11/30/git-notes-ci.links src/content/en/til/2020/12/15/shellcheck-repo.links-internal-check: src/content/en/til/2020/12/15/shellcheck-repo.links src/content/en/til/2020/12/29/svg.links-internal-check: src/content/en/til/2020/12/29/svg.links src/content/en/til/2021/01/12/curl-awk-emails.links-internal-check: src/content/en/til/2021/01/12/curl-awk-emails.links src/content/en/til/2021/01/17/posix-shebang.links-internal-check: src/content/en/til/2021/01/17/posix-shebang.links src/content/en/til/2021/04/24/cl-generic-precedence.links-internal-check: src/content/en/til/2021/04/24/cl-generic-precedence.links src/content/en/til/2021/04/24/clojure-autocurry.links-internal-check: src/content/en/til/2021/04/24/clojure-autocurry.links src/content/en/til/2021/04/24/scm-nif.links-internal-check: src/content/en/til/2021/04/24/scm-nif.links src/content/en/til/2021/07/23/git-tls-gpg.links-internal-check: src/content/en/til/2021/07/23/git-tls-gpg.links src/content/en/til/2021/08/11/js-bigint-reviver.links-internal-check: src/content/en/til/2021/08/11/js-bigint-reviver.links src/content/en/til/2026/09/05/multiline-sh-comments.links-internal-check: src/content/en/til/2026/09/05/multiline-sh-comments.links src/content/pt/hea/2020/08/12/arquivo-datado.links-internal-check: src/content/pt/hea/2020/08/12/arquivo-datado.links src/content/en/blog/index.links-internal-check: src/content/en/blog/index.links src/content/en/pastebin/index.links-internal-check: src/content/en/pastebin/index.links src/content/en/podcast/index.links-internal-check: src/content/en/podcast/index.links src/content/en/screencast/index.links-internal-check: src/content/en/screencast/index.links src/content/en/slide/index.links-internal-check: src/content/en/slide/index.links src/content/en/til/index.links-internal-check: src/content/en/til/index.links src/content/pt/hea/index.links-internal-check: src/content/pt/hea/index.links src/content/en/blog/categories.links-internal-check: src/content/en/blog/categories.links src/content/en/pastebin/categories.links-internal-check: src/content/en/pastebin/categories.links src/content/en/podcast/categories.links-internal-check: src/content/en/podcast/categories.links src/content/en/screencast/categories.links-internal-check: src/content/en/screencast/categories.links src/content/en/slide/categories.links-internal-check: src/content/en/slide/categories.links src/content/en/til/categories.links-internal-check: src/content/en/til/categories.links src/content/pt/hea/categorias.links-internal-check: src/content/pt/hea/categorias.links src/content/en/index.links-internal-check: src/content/en/index.links src/content/eo/index.links-internal-check: src/content/eo/index.links src/content/es/index.links-internal-check: src/content/es/index.links src/content/fr/index.links-internal-check: src/content/fr/index.links src/content/pt/index.links-internal-check: src/content/pt/index.links src/content/en/about.caslinks: src/content/en/about.links src/content/eo/pri.caslinks: src/content/eo/pri.links src/content/es/acerca.caslinks: src/content/es/acerca.links src/content/fr/a-propos.caslinks: src/content/fr/a-propos.links src/content/pt/sobre.caslinks: src/content/pt/sobre.links src/content/en/blog/2018/07/17/guix-nixos.caslinks: src/content/en/blog/2018/07/17/guix-nixos.links src/content/en/blog/2018/08/01/npm-ci-reproducibility.caslinks: src/content/en/blog/2018/08/01/npm-ci-reproducibility.links src/content/en/blog/2018/12/21/ytdl-subs.caslinks: src/content/en/blog/2018/12/21/ytdl-subs.links src/content/en/blog/2019/06/02/nixos-stateless-workstation.caslinks: src/content/en/blog/2019/06/02/nixos-stateless-workstation.links src/content/en/blog/2020/08/10/guix-srht.caslinks: src/content/en/blog/2020/08/10/guix-srht.links src/content/en/blog/2020/08/31/database-i-wish-i-had.caslinks: src/content/en/blog/2020/08/31/database-i-wish-i-had.links src/content/en/blog/2020/10/05/cargo2nix.caslinks: src/content/en/blog/2020/10/05/cargo2nix.links src/content/en/blog/2020/10/05/swift2nix.caslinks: src/content/en/blog/2020/10/05/swift2nix.links src/content/en/blog/2020/10/19/feature-flags.caslinks: src/content/en/blog/2020/10/19/feature-flags.links src/content/en/blog/2020/10/20/wrong-interviewing.caslinks: src/content/en/blog/2020/10/20/wrong-interviewing.links src/content/en/blog/2020/11/07/diy-bugs.caslinks: src/content/en/blog/2020/11/07/diy-bugs.links src/content/en/blog/2020/11/08/paradigm-shift-review.caslinks: src/content/en/blog/2020/11/08/paradigm-shift-review.links src/content/en/blog/2020/11/12/database-parsers-trees.caslinks: src/content/en/blog/2020/11/12/database-parsers-trees.links src/content/en/blog/2020/11/14/local-first-review.caslinks: src/content/en/blog/2020/11/14/local-first-review.links src/content/en/blog/2021/01/26/remembering-ann.caslinks: src/content/en/blog/2021/01/26/remembering-ann.links src/content/en/blog/2021/02/17/fallible.caslinks: src/content/en/blog/2021/02/17/fallible.links src/content/en/blog/2021/04/29/relational-review.caslinks: src/content/en/blog/2021/04/29/relational-review.links src/content/en/pastebin/2016/04/05/rpn.caslinks: src/content/en/pastebin/2016/04/05/rpn.links src/content/en/pastebin/2018/07/11/nix-pinning.caslinks: src/content/en/pastebin/2018/07/11/nix-pinning.links src/content/en/pastebin/2018/07/13/guix-nixos-systemd.caslinks: src/content/en/pastebin/2018/07/13/guix-nixos-systemd.links src/content/en/pastebin/2018/07/13/guixbuilder-nixos.caslinks: src/content/en/pastebin/2018/07/13/guixbuilder-nixos.links src/content/en/pastebin/2018/07/13/guixbuilder.caslinks: src/content/en/pastebin/2018/07/13/guixbuilder.links src/content/en/pastebin/2018/07/13/nix-strpad.caslinks: src/content/en/pastebin/2018/07/13/nix-strpad.links src/content/en/pastebin/2018/07/25/nix-exps.caslinks: src/content/en/pastebin/2018/07/25/nix-exps.links src/content/en/pastebin/2018/07/25/nix-showdrv.caslinks: src/content/en/pastebin/2018/07/25/nix-showdrv.links src/content/en/pastebin/2019/06/08/inconsistent-hash.caslinks: src/content/en/pastebin/2019/06/08/inconsistent-hash.links src/content/en/pastebin/2019/12/29/raku-tuple-type.caslinks: src/content/en/pastebin/2019/12/29/raku-tuple-type.links src/content/en/pastebin/2020/01/04/guix-import-failure.caslinks: src/content/en/pastebin/2020/01/04/guix-import-failure.links src/content/en/pastebin/2020/02/14/guix-shebang.caslinks: src/content/en/pastebin/2020/02/14/guix-shebang.links src/content/en/pastebin/2020/11/27/guix-build-local.caslinks: src/content/en/pastebin/2020/11/27/guix-build-local.links src/content/en/pastebin/2020/12/15/guix-pack-fail.caslinks: src/content/en/pastebin/2020/12/15/guix-pack-fail.links src/content/en/pastebin/2021/04/03/naive-slugify-js.caslinks: src/content/en/pastebin/2021/04/03/naive-slugify-js.links src/content/en/pastebin/2021/06/08/reading-session-pt1.caslinks: src/content/en/pastebin/2021/06/08/reading-session-pt1.links src/content/en/pastebin/2021/06/22/curl-wget.caslinks: src/content/en/pastebin/2021/06/22/curl-wget.links src/content/en/pastebin/2021/08/11/h1-spacing.caslinks: src/content/en/pastebin/2021/08/11/h1-spacing.links src/content/en/pastebin/2021/09/02/sicp-3-19.caslinks: src/content/en/pastebin/2021/09/02/sicp-3-19.links src/content/en/pastebin/2021/09/03/sicp-persistent-queue.caslinks: src/content/en/pastebin/2021/09/03/sicp-persistent-queue.links src/content/en/pastebin/2022/07/14/git-cleanup.caslinks: src/content/en/pastebin/2022/07/14/git-cleanup.links src/content/en/pastebin/2023/07/22/funcallable-amop.caslinks: src/content/en/pastebin/2023/07/22/funcallable-amop.links src/content/en/podcast/2020/12/19/test-entry.caslinks: src/content/en/podcast/2020/12/19/test-entry.links src/content/en/screencast/2021/02/07/autoqemu.caslinks: src/content/en/screencast/2021/02/07/autoqemu.links src/content/en/slide/2020/10/19/feature-flags.caslinks: src/content/en/slide/2020/10/19/feature-flags.links src/content/en/slide/2020/11/14/local-first-hype.caslinks: src/content/en/slide/2020/11/14/local-first-hype.links src/content/en/til/2020/08/12/filename-timestamp.caslinks: src/content/en/til/2020/08/12/filename-timestamp.links src/content/en/til/2020/08/13/code-jekyll.caslinks: src/content/en/til/2020/08/13/code-jekyll.links src/content/en/til/2020/08/14/browse-git.caslinks: src/content/en/til/2020/08/14/browse-git.links src/content/en/til/2020/08/16/git-search.caslinks: src/content/en/til/2020/08/16/git-search.links src/content/en/til/2020/08/28/grep-online.caslinks: src/content/en/til/2020/08/28/grep-online.links src/content/en/til/2020/09/04/cli-email-fun-profit.caslinks: src/content/en/til/2020/09/04/cli-email-fun-profit.links src/content/en/til/2020/09/05/oldschool-pr.caslinks: src/content/en/til/2020/09/05/oldschool-pr.links src/content/en/til/2020/10/11/search-git-history.caslinks: src/content/en/til/2020/10/11/search-git-history.links src/content/en/til/2020/11/08/find-broken-symlink.caslinks: src/content/en/til/2020/11/08/find-broken-symlink.links src/content/en/til/2020/11/12/diy-nix-bash-ci.caslinks: src/content/en/til/2020/11/12/diy-nix-bash-ci.links src/content/en/til/2020/11/12/git-bisect-automation.caslinks: src/content/en/til/2020/11/12/git-bisect-automation.links src/content/en/til/2020/11/12/useful-bashvars.caslinks: src/content/en/til/2020/11/12/useful-bashvars.links src/content/en/til/2020/11/14/gpodder-media.caslinks: src/content/en/til/2020/11/14/gpodder-media.links src/content/en/til/2020/11/30/git-notes-ci.caslinks: src/content/en/til/2020/11/30/git-notes-ci.links src/content/en/til/2020/12/15/shellcheck-repo.caslinks: src/content/en/til/2020/12/15/shellcheck-repo.links src/content/en/til/2020/12/29/svg.caslinks: src/content/en/til/2020/12/29/svg.links src/content/en/til/2021/01/12/curl-awk-emails.caslinks: src/content/en/til/2021/01/12/curl-awk-emails.links src/content/en/til/2021/01/17/posix-shebang.caslinks: src/content/en/til/2021/01/17/posix-shebang.links src/content/en/til/2021/04/24/cl-generic-precedence.caslinks: src/content/en/til/2021/04/24/cl-generic-precedence.links src/content/en/til/2021/04/24/clojure-autocurry.caslinks: src/content/en/til/2021/04/24/clojure-autocurry.links src/content/en/til/2021/04/24/scm-nif.caslinks: src/content/en/til/2021/04/24/scm-nif.links src/content/en/til/2021/07/23/git-tls-gpg.caslinks: src/content/en/til/2021/07/23/git-tls-gpg.links src/content/en/til/2021/08/11/js-bigint-reviver.caslinks: src/content/en/til/2021/08/11/js-bigint-reviver.links src/content/en/til/2026/09/05/multiline-sh-comments.caslinks: src/content/en/til/2026/09/05/multiline-sh-comments.links src/content/pt/hea/2020/08/12/arquivo-datado.caslinks: src/content/pt/hea/2020/08/12/arquivo-datado.links src/content/en/blog/index.caslinks: src/content/en/blog/index.links src/content/en/pastebin/index.caslinks: src/content/en/pastebin/index.links src/content/en/podcast/index.caslinks: src/content/en/podcast/index.links src/content/en/screencast/index.caslinks: src/content/en/screencast/index.links src/content/en/slide/index.caslinks: src/content/en/slide/index.links src/content/en/til/index.caslinks: src/content/en/til/index.links src/content/pt/hea/index.caslinks: src/content/pt/hea/index.links src/content/en/blog/categories.caslinks: src/content/en/blog/categories.links src/content/en/pastebin/categories.caslinks: src/content/en/pastebin/categories.links src/content/en/podcast/categories.caslinks: src/content/en/podcast/categories.links src/content/en/screencast/categories.caslinks: src/content/en/screencast/categories.links src/content/en/slide/categories.caslinks: src/content/en/slide/categories.links src/content/en/til/categories.caslinks: src/content/en/til/categories.links src/content/pt/hea/categorias.caslinks: src/content/pt/hea/categorias.links src/content/en/index.caslinks: src/content/en/index.links src/content/eo/index.caslinks: src/content/eo/index.links src/content/es/index.caslinks: src/content/es/index.links src/content/fr/index.caslinks: src/content/fr/index.links src/content/pt/index.caslinks: src/content/pt/index.links src/content/en/blog/2018/07/17/guix-nixos.feedentry: src/content/en/blog/2018/07/17/guix-nixos.json src/content/en/blog/2018/07/17/guix-nixos.htmlbody src/content/en/blog/2018/08/01/npm-ci-reproducibility.feedentry: src/content/en/blog/2018/08/01/npm-ci-reproducibility.json src/content/en/blog/2018/08/01/npm-ci-reproducibility.htmlbody src/content/en/blog/2018/12/21/ytdl-subs.feedentry: src/content/en/blog/2018/12/21/ytdl-subs.json src/content/en/blog/2018/12/21/ytdl-subs.htmlbody src/content/en/blog/2019/06/02/nixos-stateless-workstation.feedentry: src/content/en/blog/2019/06/02/nixos-stateless-workstation.json src/content/en/blog/2019/06/02/nixos-stateless-workstation.htmlbody src/content/en/blog/2020/08/10/guix-srht.feedentry: src/content/en/blog/2020/08/10/guix-srht.json src/content/en/blog/2020/08/10/guix-srht.htmlbody src/content/en/blog/2020/08/31/database-i-wish-i-had.feedentry: src/content/en/blog/2020/08/31/database-i-wish-i-had.json src/content/en/blog/2020/08/31/database-i-wish-i-had.htmlbody src/content/en/blog/2020/10/05/cargo2nix.feedentry: src/content/en/blog/2020/10/05/cargo2nix.json src/content/en/blog/2020/10/05/cargo2nix.htmlbody src/content/en/blog/2020/10/05/swift2nix.feedentry: src/content/en/blog/2020/10/05/swift2nix.json src/content/en/blog/2020/10/05/swift2nix.htmlbody src/content/en/blog/2020/10/19/feature-flags.feedentry: src/content/en/blog/2020/10/19/feature-flags.json src/content/en/blog/2020/10/19/feature-flags.htmlbody src/content/en/blog/2020/10/20/wrong-interviewing.feedentry: src/content/en/blog/2020/10/20/wrong-interviewing.json src/content/en/blog/2020/10/20/wrong-interviewing.htmlbody src/content/en/blog/2020/11/07/diy-bugs.feedentry: src/content/en/blog/2020/11/07/diy-bugs.json src/content/en/blog/2020/11/07/diy-bugs.htmlbody src/content/en/blog/2020/11/08/paradigm-shift-review.feedentry: src/content/en/blog/2020/11/08/paradigm-shift-review.json src/content/en/blog/2020/11/08/paradigm-shift-review.htmlbody src/content/en/blog/2020/11/12/database-parsers-trees.feedentry: src/content/en/blog/2020/11/12/database-parsers-trees.json src/content/en/blog/2020/11/12/database-parsers-trees.htmlbody src/content/en/blog/2020/11/14/local-first-review.feedentry: src/content/en/blog/2020/11/14/local-first-review.json src/content/en/blog/2020/11/14/local-first-review.htmlbody src/content/en/blog/2021/01/26/remembering-ann.feedentry: src/content/en/blog/2021/01/26/remembering-ann.json src/content/en/blog/2021/01/26/remembering-ann.htmlbody src/content/en/blog/2021/02/17/fallible.feedentry: src/content/en/blog/2021/02/17/fallible.json src/content/en/blog/2021/02/17/fallible.htmlbody src/content/en/blog/2021/04/29/relational-review.feedentry: src/content/en/blog/2021/04/29/relational-review.json src/content/en/blog/2021/04/29/relational-review.htmlbody src/content/en/pastebin/2016/04/05/rpn.feedentry: src/content/en/pastebin/2016/04/05/rpn.json src/content/en/pastebin/2016/04/05/rpn.htmlbody src/content/en/pastebin/2018/07/11/nix-pinning.feedentry: src/content/en/pastebin/2018/07/11/nix-pinning.json src/content/en/pastebin/2018/07/11/nix-pinning.htmlbody src/content/en/pastebin/2018/07/13/guix-nixos-systemd.feedentry: src/content/en/pastebin/2018/07/13/guix-nixos-systemd.json src/content/en/pastebin/2018/07/13/guix-nixos-systemd.htmlbody src/content/en/pastebin/2018/07/13/guixbuilder-nixos.feedentry: src/content/en/pastebin/2018/07/13/guixbuilder-nixos.json src/content/en/pastebin/2018/07/13/guixbuilder-nixos.htmlbody src/content/en/pastebin/2018/07/13/guixbuilder.feedentry: src/content/en/pastebin/2018/07/13/guixbuilder.json src/content/en/pastebin/2018/07/13/guixbuilder.htmlbody src/content/en/pastebin/2018/07/13/nix-strpad.feedentry: src/content/en/pastebin/2018/07/13/nix-strpad.json src/content/en/pastebin/2018/07/13/nix-strpad.htmlbody src/content/en/pastebin/2018/07/25/nix-exps.feedentry: src/content/en/pastebin/2018/07/25/nix-exps.json src/content/en/pastebin/2018/07/25/nix-exps.htmlbody src/content/en/pastebin/2018/07/25/nix-showdrv.feedentry: src/content/en/pastebin/2018/07/25/nix-showdrv.json src/content/en/pastebin/2018/07/25/nix-showdrv.htmlbody src/content/en/pastebin/2019/06/08/inconsistent-hash.feedentry: src/content/en/pastebin/2019/06/08/inconsistent-hash.json src/content/en/pastebin/2019/06/08/inconsistent-hash.htmlbody src/content/en/pastebin/2019/12/29/raku-tuple-type.feedentry: src/content/en/pastebin/2019/12/29/raku-tuple-type.json src/content/en/pastebin/2019/12/29/raku-tuple-type.htmlbody src/content/en/pastebin/2020/01/04/guix-import-failure.feedentry: src/content/en/pastebin/2020/01/04/guix-import-failure.json src/content/en/pastebin/2020/01/04/guix-import-failure.htmlbody src/content/en/pastebin/2020/02/14/guix-shebang.feedentry: src/content/en/pastebin/2020/02/14/guix-shebang.json src/content/en/pastebin/2020/02/14/guix-shebang.htmlbody src/content/en/pastebin/2020/11/27/guix-build-local.feedentry: src/content/en/pastebin/2020/11/27/guix-build-local.json src/content/en/pastebin/2020/11/27/guix-build-local.htmlbody src/content/en/pastebin/2020/12/15/guix-pack-fail.feedentry: src/content/en/pastebin/2020/12/15/guix-pack-fail.json src/content/en/pastebin/2020/12/15/guix-pack-fail.htmlbody src/content/en/pastebin/2021/04/03/naive-slugify-js.feedentry: src/content/en/pastebin/2021/04/03/naive-slugify-js.json src/content/en/pastebin/2021/04/03/naive-slugify-js.htmlbody src/content/en/pastebin/2021/06/08/reading-session-pt1.feedentry: src/content/en/pastebin/2021/06/08/reading-session-pt1.json src/content/en/pastebin/2021/06/08/reading-session-pt1.htmlbody src/content/en/pastebin/2021/06/22/curl-wget.feedentry: src/content/en/pastebin/2021/06/22/curl-wget.json src/content/en/pastebin/2021/06/22/curl-wget.htmlbody src/content/en/pastebin/2021/08/11/h1-spacing.feedentry: src/content/en/pastebin/2021/08/11/h1-spacing.json src/content/en/pastebin/2021/08/11/h1-spacing.htmlbody src/content/en/pastebin/2021/09/02/sicp-3-19.feedentry: src/content/en/pastebin/2021/09/02/sicp-3-19.json src/content/en/pastebin/2021/09/02/sicp-3-19.htmlbody src/content/en/pastebin/2021/09/03/sicp-persistent-queue.feedentry: src/content/en/pastebin/2021/09/03/sicp-persistent-queue.json src/content/en/pastebin/2021/09/03/sicp-persistent-queue.htmlbody src/content/en/pastebin/2022/07/14/git-cleanup.feedentry: src/content/en/pastebin/2022/07/14/git-cleanup.json src/content/en/pastebin/2022/07/14/git-cleanup.htmlbody src/content/en/pastebin/2023/07/22/funcallable-amop.feedentry: src/content/en/pastebin/2023/07/22/funcallable-amop.json src/content/en/pastebin/2023/07/22/funcallable-amop.htmlbody src/content/en/podcast/2020/12/19/test-entry.feedentry: src/content/en/podcast/2020/12/19/test-entry.json src/content/en/podcast/2020/12/19/test-entry.htmlbody src/content/en/screencast/2021/02/07/autoqemu.feedentry: src/content/en/screencast/2021/02/07/autoqemu.json src/content/en/screencast/2021/02/07/autoqemu.htmlbody src/content/en/slide/2020/10/19/feature-flags.feedentry: src/content/en/slide/2020/10/19/feature-flags.json src/content/en/slide/2020/10/19/feature-flags.htmlbody src/content/en/slide/2020/11/14/local-first-hype.feedentry: src/content/en/slide/2020/11/14/local-first-hype.json src/content/en/slide/2020/11/14/local-first-hype.htmlbody src/content/en/til/2020/08/12/filename-timestamp.feedentry: src/content/en/til/2020/08/12/filename-timestamp.json src/content/en/til/2020/08/12/filename-timestamp.htmlbody src/content/en/til/2020/08/13/code-jekyll.feedentry: src/content/en/til/2020/08/13/code-jekyll.json src/content/en/til/2020/08/13/code-jekyll.htmlbody src/content/en/til/2020/08/14/browse-git.feedentry: src/content/en/til/2020/08/14/browse-git.json src/content/en/til/2020/08/14/browse-git.htmlbody src/content/en/til/2020/08/16/git-search.feedentry: src/content/en/til/2020/08/16/git-search.json src/content/en/til/2020/08/16/git-search.htmlbody src/content/en/til/2020/08/28/grep-online.feedentry: src/content/en/til/2020/08/28/grep-online.json src/content/en/til/2020/08/28/grep-online.htmlbody src/content/en/til/2020/09/04/cli-email-fun-profit.feedentry: src/content/en/til/2020/09/04/cli-email-fun-profit.json src/content/en/til/2020/09/04/cli-email-fun-profit.htmlbody src/content/en/til/2020/09/05/oldschool-pr.feedentry: src/content/en/til/2020/09/05/oldschool-pr.json src/content/en/til/2020/09/05/oldschool-pr.htmlbody src/content/en/til/2020/10/11/search-git-history.feedentry: src/content/en/til/2020/10/11/search-git-history.json src/content/en/til/2020/10/11/search-git-history.htmlbody src/content/en/til/2020/11/08/find-broken-symlink.feedentry: src/content/en/til/2020/11/08/find-broken-symlink.json src/content/en/til/2020/11/08/find-broken-symlink.htmlbody src/content/en/til/2020/11/12/diy-nix-bash-ci.feedentry: src/content/en/til/2020/11/12/diy-nix-bash-ci.json src/content/en/til/2020/11/12/diy-nix-bash-ci.htmlbody src/content/en/til/2020/11/12/git-bisect-automation.feedentry: src/content/en/til/2020/11/12/git-bisect-automation.json src/content/en/til/2020/11/12/git-bisect-automation.htmlbody src/content/en/til/2020/11/12/useful-bashvars.feedentry: src/content/en/til/2020/11/12/useful-bashvars.json src/content/en/til/2020/11/12/useful-bashvars.htmlbody src/content/en/til/2020/11/14/gpodder-media.feedentry: src/content/en/til/2020/11/14/gpodder-media.json src/content/en/til/2020/11/14/gpodder-media.htmlbody src/content/en/til/2020/11/30/git-notes-ci.feedentry: src/content/en/til/2020/11/30/git-notes-ci.json src/content/en/til/2020/11/30/git-notes-ci.htmlbody src/content/en/til/2020/12/15/shellcheck-repo.feedentry: src/content/en/til/2020/12/15/shellcheck-repo.json src/content/en/til/2020/12/15/shellcheck-repo.htmlbody src/content/en/til/2020/12/29/svg.feedentry: src/content/en/til/2020/12/29/svg.json src/content/en/til/2020/12/29/svg.htmlbody src/content/en/til/2021/01/12/curl-awk-emails.feedentry: src/content/en/til/2021/01/12/curl-awk-emails.json src/content/en/til/2021/01/12/curl-awk-emails.htmlbody src/content/en/til/2021/01/17/posix-shebang.feedentry: src/content/en/til/2021/01/17/posix-shebang.json src/content/en/til/2021/01/17/posix-shebang.htmlbody src/content/en/til/2021/04/24/cl-generic-precedence.feedentry: src/content/en/til/2021/04/24/cl-generic-precedence.json src/content/en/til/2021/04/24/cl-generic-precedence.htmlbody src/content/en/til/2021/04/24/clojure-autocurry.feedentry: src/content/en/til/2021/04/24/clojure-autocurry.json src/content/en/til/2021/04/24/clojure-autocurry.htmlbody src/content/en/til/2021/04/24/scm-nif.feedentry: src/content/en/til/2021/04/24/scm-nif.json src/content/en/til/2021/04/24/scm-nif.htmlbody src/content/en/til/2021/07/23/git-tls-gpg.feedentry: src/content/en/til/2021/07/23/git-tls-gpg.json src/content/en/til/2021/07/23/git-tls-gpg.htmlbody src/content/en/til/2021/08/11/js-bigint-reviver.feedentry: src/content/en/til/2021/08/11/js-bigint-reviver.json src/content/en/til/2021/08/11/js-bigint-reviver.htmlbody src/content/en/til/2026/09/05/multiline-sh-comments.feedentry: src/content/en/til/2026/09/05/multiline-sh-comments.json src/content/en/til/2026/09/05/multiline-sh-comments.htmlbody src/content/pt/hea/2020/08/12/arquivo-datado.feedentry: src/content/pt/hea/2020/08/12/arquivo-datado.json src/content/pt/hea/2020/08/12/arquivo-datado.htmlbody src/content/en/blog/2018/07/17/guix-nixos.sortdata: src/content/en/blog/2018/07/17/guix-nixos.json src/content/en/blog/2018/08/01/npm-ci-reproducibility.sortdata: src/content/en/blog/2018/08/01/npm-ci-reproducibility.json src/content/en/blog/2018/12/21/ytdl-subs.sortdata: src/content/en/blog/2018/12/21/ytdl-subs.json src/content/en/blog/2019/06/02/nixos-stateless-workstation.sortdata: src/content/en/blog/2019/06/02/nixos-stateless-workstation.json src/content/en/blog/2020/08/10/guix-srht.sortdata: src/content/en/blog/2020/08/10/guix-srht.json src/content/en/blog/2020/08/31/database-i-wish-i-had.sortdata: src/content/en/blog/2020/08/31/database-i-wish-i-had.json src/content/en/blog/2020/10/05/cargo2nix.sortdata: src/content/en/blog/2020/10/05/cargo2nix.json src/content/en/blog/2020/10/05/swift2nix.sortdata: src/content/en/blog/2020/10/05/swift2nix.json src/content/en/blog/2020/10/19/feature-flags.sortdata: src/content/en/blog/2020/10/19/feature-flags.json src/content/en/blog/2020/10/20/wrong-interviewing.sortdata: src/content/en/blog/2020/10/20/wrong-interviewing.json src/content/en/blog/2020/11/07/diy-bugs.sortdata: src/content/en/blog/2020/11/07/diy-bugs.json src/content/en/blog/2020/11/08/paradigm-shift-review.sortdata: src/content/en/blog/2020/11/08/paradigm-shift-review.json src/content/en/blog/2020/11/12/database-parsers-trees.sortdata: src/content/en/blog/2020/11/12/database-parsers-trees.json src/content/en/blog/2020/11/14/local-first-review.sortdata: src/content/en/blog/2020/11/14/local-first-review.json src/content/en/blog/2021/01/26/remembering-ann.sortdata: src/content/en/blog/2021/01/26/remembering-ann.json src/content/en/blog/2021/02/17/fallible.sortdata: src/content/en/blog/2021/02/17/fallible.json src/content/en/blog/2021/04/29/relational-review.sortdata: src/content/en/blog/2021/04/29/relational-review.json src/content/en/pastebin/2016/04/05/rpn.sortdata: src/content/en/pastebin/2016/04/05/rpn.json src/content/en/pastebin/2018/07/11/nix-pinning.sortdata: src/content/en/pastebin/2018/07/11/nix-pinning.json src/content/en/pastebin/2018/07/13/guix-nixos-systemd.sortdata: src/content/en/pastebin/2018/07/13/guix-nixos-systemd.json src/content/en/pastebin/2018/07/13/guixbuilder-nixos.sortdata: src/content/en/pastebin/2018/07/13/guixbuilder-nixos.json src/content/en/pastebin/2018/07/13/guixbuilder.sortdata: src/content/en/pastebin/2018/07/13/guixbuilder.json src/content/en/pastebin/2018/07/13/nix-strpad.sortdata: src/content/en/pastebin/2018/07/13/nix-strpad.json src/content/en/pastebin/2018/07/25/nix-exps.sortdata: src/content/en/pastebin/2018/07/25/nix-exps.json src/content/en/pastebin/2018/07/25/nix-showdrv.sortdata: src/content/en/pastebin/2018/07/25/nix-showdrv.json src/content/en/pastebin/2019/06/08/inconsistent-hash.sortdata: src/content/en/pastebin/2019/06/08/inconsistent-hash.json src/content/en/pastebin/2019/12/29/raku-tuple-type.sortdata: src/content/en/pastebin/2019/12/29/raku-tuple-type.json src/content/en/pastebin/2020/01/04/guix-import-failure.sortdata: src/content/en/pastebin/2020/01/04/guix-import-failure.json src/content/en/pastebin/2020/02/14/guix-shebang.sortdata: src/content/en/pastebin/2020/02/14/guix-shebang.json src/content/en/pastebin/2020/11/27/guix-build-local.sortdata: src/content/en/pastebin/2020/11/27/guix-build-local.json src/content/en/pastebin/2020/12/15/guix-pack-fail.sortdata: src/content/en/pastebin/2020/12/15/guix-pack-fail.json src/content/en/pastebin/2021/04/03/naive-slugify-js.sortdata: src/content/en/pastebin/2021/04/03/naive-slugify-js.json src/content/en/pastebin/2021/06/08/reading-session-pt1.sortdata: src/content/en/pastebin/2021/06/08/reading-session-pt1.json src/content/en/pastebin/2021/06/22/curl-wget.sortdata: src/content/en/pastebin/2021/06/22/curl-wget.json src/content/en/pastebin/2021/08/11/h1-spacing.sortdata: src/content/en/pastebin/2021/08/11/h1-spacing.json src/content/en/pastebin/2021/09/02/sicp-3-19.sortdata: src/content/en/pastebin/2021/09/02/sicp-3-19.json src/content/en/pastebin/2021/09/03/sicp-persistent-queue.sortdata: src/content/en/pastebin/2021/09/03/sicp-persistent-queue.json src/content/en/pastebin/2022/07/14/git-cleanup.sortdata: src/content/en/pastebin/2022/07/14/git-cleanup.json src/content/en/pastebin/2023/07/22/funcallable-amop.sortdata: src/content/en/pastebin/2023/07/22/funcallable-amop.json src/content/en/podcast/2020/12/19/test-entry.sortdata: src/content/en/podcast/2020/12/19/test-entry.json src/content/en/screencast/2021/02/07/autoqemu.sortdata: src/content/en/screencast/2021/02/07/autoqemu.json src/content/en/slide/2020/10/19/feature-flags.sortdata: src/content/en/slide/2020/10/19/feature-flags.json src/content/en/slide/2020/11/14/local-first-hype.sortdata: src/content/en/slide/2020/11/14/local-first-hype.json src/content/en/til/2020/08/12/filename-timestamp.sortdata: src/content/en/til/2020/08/12/filename-timestamp.json src/content/en/til/2020/08/13/code-jekyll.sortdata: src/content/en/til/2020/08/13/code-jekyll.json src/content/en/til/2020/08/14/browse-git.sortdata: src/content/en/til/2020/08/14/browse-git.json src/content/en/til/2020/08/16/git-search.sortdata: src/content/en/til/2020/08/16/git-search.json src/content/en/til/2020/08/28/grep-online.sortdata: src/content/en/til/2020/08/28/grep-online.json src/content/en/til/2020/09/04/cli-email-fun-profit.sortdata: src/content/en/til/2020/09/04/cli-email-fun-profit.json src/content/en/til/2020/09/05/oldschool-pr.sortdata: src/content/en/til/2020/09/05/oldschool-pr.json src/content/en/til/2020/10/11/search-git-history.sortdata: src/content/en/til/2020/10/11/search-git-history.json src/content/en/til/2020/11/08/find-broken-symlink.sortdata: src/content/en/til/2020/11/08/find-broken-symlink.json src/content/en/til/2020/11/12/diy-nix-bash-ci.sortdata: src/content/en/til/2020/11/12/diy-nix-bash-ci.json src/content/en/til/2020/11/12/git-bisect-automation.sortdata: src/content/en/til/2020/11/12/git-bisect-automation.json src/content/en/til/2020/11/12/useful-bashvars.sortdata: src/content/en/til/2020/11/12/useful-bashvars.json src/content/en/til/2020/11/14/gpodder-media.sortdata: src/content/en/til/2020/11/14/gpodder-media.json src/content/en/til/2020/11/30/git-notes-ci.sortdata: src/content/en/til/2020/11/30/git-notes-ci.json src/content/en/til/2020/12/15/shellcheck-repo.sortdata: src/content/en/til/2020/12/15/shellcheck-repo.json src/content/en/til/2020/12/29/svg.sortdata: src/content/en/til/2020/12/29/svg.json src/content/en/til/2021/01/12/curl-awk-emails.sortdata: src/content/en/til/2021/01/12/curl-awk-emails.json src/content/en/til/2021/01/17/posix-shebang.sortdata: src/content/en/til/2021/01/17/posix-shebang.json src/content/en/til/2021/04/24/cl-generic-precedence.sortdata: src/content/en/til/2021/04/24/cl-generic-precedence.json src/content/en/til/2021/04/24/clojure-autocurry.sortdata: src/content/en/til/2021/04/24/clojure-autocurry.json src/content/en/til/2021/04/24/scm-nif.sortdata: src/content/en/til/2021/04/24/scm-nif.json src/content/en/til/2021/07/23/git-tls-gpg.sortdata: src/content/en/til/2021/07/23/git-tls-gpg.json src/content/en/til/2021/08/11/js-bigint-reviver.sortdata: src/content/en/til/2021/08/11/js-bigint-reviver.json src/content/en/til/2026/09/05/multiline-sh-comments.sortdata: src/content/en/til/2026/09/05/multiline-sh-comments.json src/content/pt/hea/2020/08/12/arquivo-datado.sortdata: src/content/pt/hea/2020/08/12/arquivo-datado.json src/content/en/blog/2018/07/17/guix-nixos.html: src/content/en/blog/2018/07/17/guix-nixos.prevnext src/content/en/blog/2018/08/01/npm-ci-reproducibility.html: src/content/en/blog/2018/08/01/npm-ci-reproducibility.prevnext src/content/en/blog/2018/12/21/ytdl-subs.html: src/content/en/blog/2018/12/21/ytdl-subs.prevnext src/content/en/blog/2019/06/02/nixos-stateless-workstation.html: src/content/en/blog/2019/06/02/nixos-stateless-workstation.prevnext src/content/en/blog/2020/08/10/guix-srht.html: src/content/en/blog/2020/08/10/guix-srht.prevnext src/content/en/blog/2020/08/31/database-i-wish-i-had.html: src/content/en/blog/2020/08/31/database-i-wish-i-had.prevnext src/content/en/blog/2020/10/05/cargo2nix.html: src/content/en/blog/2020/10/05/cargo2nix.prevnext src/content/en/blog/2020/10/05/swift2nix.html: src/content/en/blog/2020/10/05/swift2nix.prevnext src/content/en/blog/2020/10/19/feature-flags.html: src/content/en/blog/2020/10/19/feature-flags.prevnext src/content/en/blog/2020/10/20/wrong-interviewing.html: src/content/en/blog/2020/10/20/wrong-interviewing.prevnext src/content/en/blog/2020/11/07/diy-bugs.html: src/content/en/blog/2020/11/07/diy-bugs.prevnext src/content/en/blog/2020/11/08/paradigm-shift-review.html: src/content/en/blog/2020/11/08/paradigm-shift-review.prevnext src/content/en/blog/2020/11/12/database-parsers-trees.html: src/content/en/blog/2020/11/12/database-parsers-trees.prevnext src/content/en/blog/2020/11/14/local-first-review.html: src/content/en/blog/2020/11/14/local-first-review.prevnext src/content/en/blog/2021/01/26/remembering-ann.html: src/content/en/blog/2021/01/26/remembering-ann.prevnext src/content/en/blog/2021/02/17/fallible.html: src/content/en/blog/2021/02/17/fallible.prevnext src/content/en/blog/2021/04/29/relational-review.html: src/content/en/blog/2021/04/29/relational-review.prevnext src/content/en/pastebin/2016/04/05/rpn.html: src/content/en/pastebin/2016/04/05/rpn.prevnext src/content/en/pastebin/2018/07/11/nix-pinning.html: src/content/en/pastebin/2018/07/11/nix-pinning.prevnext src/content/en/pastebin/2018/07/13/guix-nixos-systemd.html: src/content/en/pastebin/2018/07/13/guix-nixos-systemd.prevnext src/content/en/pastebin/2018/07/13/guixbuilder-nixos.html: src/content/en/pastebin/2018/07/13/guixbuilder-nixos.prevnext src/content/en/pastebin/2018/07/13/guixbuilder.html: src/content/en/pastebin/2018/07/13/guixbuilder.prevnext src/content/en/pastebin/2018/07/13/nix-strpad.html: src/content/en/pastebin/2018/07/13/nix-strpad.prevnext src/content/en/pastebin/2018/07/25/nix-exps.html: src/content/en/pastebin/2018/07/25/nix-exps.prevnext src/content/en/pastebin/2018/07/25/nix-showdrv.html: src/content/en/pastebin/2018/07/25/nix-showdrv.prevnext src/content/en/pastebin/2019/06/08/inconsistent-hash.html: src/content/en/pastebin/2019/06/08/inconsistent-hash.prevnext src/content/en/pastebin/2019/12/29/raku-tuple-type.html: src/content/en/pastebin/2019/12/29/raku-tuple-type.prevnext src/content/en/pastebin/2020/01/04/guix-import-failure.html: src/content/en/pastebin/2020/01/04/guix-import-failure.prevnext src/content/en/pastebin/2020/02/14/guix-shebang.html: src/content/en/pastebin/2020/02/14/guix-shebang.prevnext src/content/en/pastebin/2020/11/27/guix-build-local.html: src/content/en/pastebin/2020/11/27/guix-build-local.prevnext src/content/en/pastebin/2020/12/15/guix-pack-fail.html: src/content/en/pastebin/2020/12/15/guix-pack-fail.prevnext src/content/en/pastebin/2021/04/03/naive-slugify-js.html: src/content/en/pastebin/2021/04/03/naive-slugify-js.prevnext src/content/en/pastebin/2021/06/08/reading-session-pt1.html: src/content/en/pastebin/2021/06/08/reading-session-pt1.prevnext src/content/en/pastebin/2021/06/22/curl-wget.html: src/content/en/pastebin/2021/06/22/curl-wget.prevnext src/content/en/pastebin/2021/08/11/h1-spacing.html: src/content/en/pastebin/2021/08/11/h1-spacing.prevnext src/content/en/pastebin/2021/09/02/sicp-3-19.html: src/content/en/pastebin/2021/09/02/sicp-3-19.prevnext src/content/en/pastebin/2021/09/03/sicp-persistent-queue.html: src/content/en/pastebin/2021/09/03/sicp-persistent-queue.prevnext src/content/en/pastebin/2022/07/14/git-cleanup.html: src/content/en/pastebin/2022/07/14/git-cleanup.prevnext src/content/en/pastebin/2023/07/22/funcallable-amop.html: src/content/en/pastebin/2023/07/22/funcallable-amop.prevnext src/content/en/podcast/2020/12/19/test-entry.html: src/content/en/podcast/2020/12/19/test-entry.prevnext src/content/en/screencast/2021/02/07/autoqemu.html: src/content/en/screencast/2021/02/07/autoqemu.prevnext src/content/en/slide/2020/10/19/feature-flags.html: src/content/en/slide/2020/10/19/feature-flags.prevnext src/content/en/slide/2020/11/14/local-first-hype.html: src/content/en/slide/2020/11/14/local-first-hype.prevnext src/content/en/til/2020/08/12/filename-timestamp.html: src/content/en/til/2020/08/12/filename-timestamp.prevnext src/content/en/til/2020/08/13/code-jekyll.html: src/content/en/til/2020/08/13/code-jekyll.prevnext src/content/en/til/2020/08/14/browse-git.html: src/content/en/til/2020/08/14/browse-git.prevnext src/content/en/til/2020/08/16/git-search.html: src/content/en/til/2020/08/16/git-search.prevnext src/content/en/til/2020/08/28/grep-online.html: src/content/en/til/2020/08/28/grep-online.prevnext src/content/en/til/2020/09/04/cli-email-fun-profit.html: src/content/en/til/2020/09/04/cli-email-fun-profit.prevnext src/content/en/til/2020/09/05/oldschool-pr.html: src/content/en/til/2020/09/05/oldschool-pr.prevnext src/content/en/til/2020/10/11/search-git-history.html: src/content/en/til/2020/10/11/search-git-history.prevnext src/content/en/til/2020/11/08/find-broken-symlink.html: src/content/en/til/2020/11/08/find-broken-symlink.prevnext src/content/en/til/2020/11/12/diy-nix-bash-ci.html: src/content/en/til/2020/11/12/diy-nix-bash-ci.prevnext src/content/en/til/2020/11/12/git-bisect-automation.html: src/content/en/til/2020/11/12/git-bisect-automation.prevnext src/content/en/til/2020/11/12/useful-bashvars.html: src/content/en/til/2020/11/12/useful-bashvars.prevnext src/content/en/til/2020/11/14/gpodder-media.html: src/content/en/til/2020/11/14/gpodder-media.prevnext src/content/en/til/2020/11/30/git-notes-ci.html: src/content/en/til/2020/11/30/git-notes-ci.prevnext src/content/en/til/2020/12/15/shellcheck-repo.html: src/content/en/til/2020/12/15/shellcheck-repo.prevnext src/content/en/til/2020/12/29/svg.html: src/content/en/til/2020/12/29/svg.prevnext src/content/en/til/2021/01/12/curl-awk-emails.html: src/content/en/til/2021/01/12/curl-awk-emails.prevnext src/content/en/til/2021/01/17/posix-shebang.html: src/content/en/til/2021/01/17/posix-shebang.prevnext src/content/en/til/2021/04/24/cl-generic-precedence.html: src/content/en/til/2021/04/24/cl-generic-precedence.prevnext src/content/en/til/2021/04/24/clojure-autocurry.html: src/content/en/til/2021/04/24/clojure-autocurry.prevnext src/content/en/til/2021/04/24/scm-nif.html: src/content/en/til/2021/04/24/scm-nif.prevnext src/content/en/til/2021/07/23/git-tls-gpg.html: src/content/en/til/2021/07/23/git-tls-gpg.prevnext src/content/en/til/2021/08/11/js-bigint-reviver.html: src/content/en/til/2021/08/11/js-bigint-reviver.prevnext src/content/en/til/2026/09/05/multiline-sh-comments.html: src/content/en/til/2026/09/05/multiline-sh-comments.prevnext src/content/pt/hea/2020/08/12/arquivo-datado.html: src/content/pt/hea/2020/08/12/arquivo-datado.prevnext src/content/en/about.html: src/content/en/about.comments src/content/eo/pri.html: src/content/eo/pri.comments src/content/es/acerca.html: src/content/es/acerca.comments src/content/fr/a-propos.html: src/content/fr/a-propos.comments src/content/pt/sobre.html: src/content/pt/sobre.comments src/content/en/blog/2018/07/17/guix-nixos.html: src/content/en/blog/2018/07/17/guix-nixos.comments src/content/en/blog/2018/08/01/npm-ci-reproducibility.html: src/content/en/blog/2018/08/01/npm-ci-reproducibility.comments src/content/en/blog/2018/12/21/ytdl-subs.html: src/content/en/blog/2018/12/21/ytdl-subs.comments src/content/en/blog/2019/06/02/nixos-stateless-workstation.html: src/content/en/blog/2019/06/02/nixos-stateless-workstation.comments src/content/en/blog/2020/08/10/guix-srht.html: src/content/en/blog/2020/08/10/guix-srht.comments src/content/en/blog/2020/08/31/database-i-wish-i-had.html: src/content/en/blog/2020/08/31/database-i-wish-i-had.comments src/content/en/blog/2020/10/05/cargo2nix.html: src/content/en/blog/2020/10/05/cargo2nix.comments src/content/en/blog/2020/10/05/swift2nix.html: src/content/en/blog/2020/10/05/swift2nix.comments src/content/en/blog/2020/10/19/feature-flags.html: src/content/en/blog/2020/10/19/feature-flags.comments src/content/en/blog/2020/10/20/wrong-interviewing.html: src/content/en/blog/2020/10/20/wrong-interviewing.comments src/content/en/blog/2020/11/07/diy-bugs.html: src/content/en/blog/2020/11/07/diy-bugs.comments src/content/en/blog/2020/11/08/paradigm-shift-review.html: src/content/en/blog/2020/11/08/paradigm-shift-review.comments src/content/en/blog/2020/11/12/database-parsers-trees.html: src/content/en/blog/2020/11/12/database-parsers-trees.comments src/content/en/blog/2020/11/14/local-first-review.html: src/content/en/blog/2020/11/14/local-first-review.comments src/content/en/blog/2021/01/26/remembering-ann.html: src/content/en/blog/2021/01/26/remembering-ann.comments src/content/en/blog/2021/02/17/fallible.html: src/content/en/blog/2021/02/17/fallible.comments src/content/en/blog/2021/04/29/relational-review.html: src/content/en/blog/2021/04/29/relational-review.comments src/content/en/pastebin/2016/04/05/rpn.html: src/content/en/pastebin/2016/04/05/rpn.comments src/content/en/pastebin/2018/07/11/nix-pinning.html: src/content/en/pastebin/2018/07/11/nix-pinning.comments src/content/en/pastebin/2018/07/13/guix-nixos-systemd.html: src/content/en/pastebin/2018/07/13/guix-nixos-systemd.comments src/content/en/pastebin/2018/07/13/guixbuilder-nixos.html: src/content/en/pastebin/2018/07/13/guixbuilder-nixos.comments src/content/en/pastebin/2018/07/13/guixbuilder.html: src/content/en/pastebin/2018/07/13/guixbuilder.comments src/content/en/pastebin/2018/07/13/nix-strpad.html: src/content/en/pastebin/2018/07/13/nix-strpad.comments src/content/en/pastebin/2018/07/25/nix-exps.html: src/content/en/pastebin/2018/07/25/nix-exps.comments src/content/en/pastebin/2018/07/25/nix-showdrv.html: src/content/en/pastebin/2018/07/25/nix-showdrv.comments src/content/en/pastebin/2019/06/08/inconsistent-hash.html: src/content/en/pastebin/2019/06/08/inconsistent-hash.comments src/content/en/pastebin/2019/12/29/raku-tuple-type.html: src/content/en/pastebin/2019/12/29/raku-tuple-type.comments src/content/en/pastebin/2020/01/04/guix-import-failure.html: src/content/en/pastebin/2020/01/04/guix-import-failure.comments src/content/en/pastebin/2020/02/14/guix-shebang.html: src/content/en/pastebin/2020/02/14/guix-shebang.comments src/content/en/pastebin/2020/11/27/guix-build-local.html: src/content/en/pastebin/2020/11/27/guix-build-local.comments src/content/en/pastebin/2020/12/15/guix-pack-fail.html: src/content/en/pastebin/2020/12/15/guix-pack-fail.comments src/content/en/pastebin/2021/04/03/naive-slugify-js.html: src/content/en/pastebin/2021/04/03/naive-slugify-js.comments src/content/en/pastebin/2021/06/08/reading-session-pt1.html: src/content/en/pastebin/2021/06/08/reading-session-pt1.comments src/content/en/pastebin/2021/06/22/curl-wget.html: src/content/en/pastebin/2021/06/22/curl-wget.comments src/content/en/pastebin/2021/08/11/h1-spacing.html: src/content/en/pastebin/2021/08/11/h1-spacing.comments src/content/en/pastebin/2021/09/02/sicp-3-19.html: src/content/en/pastebin/2021/09/02/sicp-3-19.comments src/content/en/pastebin/2021/09/03/sicp-persistent-queue.html: src/content/en/pastebin/2021/09/03/sicp-persistent-queue.comments src/content/en/pastebin/2022/07/14/git-cleanup.html: src/content/en/pastebin/2022/07/14/git-cleanup.comments src/content/en/pastebin/2023/07/22/funcallable-amop.html: src/content/en/pastebin/2023/07/22/funcallable-amop.comments src/content/en/podcast/2020/12/19/test-entry.html: src/content/en/podcast/2020/12/19/test-entry.comments src/content/en/screencast/2021/02/07/autoqemu.html: src/content/en/screencast/2021/02/07/autoqemu.comments src/content/en/slide/2020/10/19/feature-flags.html: src/content/en/slide/2020/10/19/feature-flags.comments src/content/en/slide/2020/11/14/local-first-hype.html: src/content/en/slide/2020/11/14/local-first-hype.comments src/content/en/til/2020/08/12/filename-timestamp.html: src/content/en/til/2020/08/12/filename-timestamp.comments src/content/en/til/2020/08/13/code-jekyll.html: src/content/en/til/2020/08/13/code-jekyll.comments src/content/en/til/2020/08/14/browse-git.html: src/content/en/til/2020/08/14/browse-git.comments src/content/en/til/2020/08/16/git-search.html: src/content/en/til/2020/08/16/git-search.comments src/content/en/til/2020/08/28/grep-online.html: src/content/en/til/2020/08/28/grep-online.comments src/content/en/til/2020/09/04/cli-email-fun-profit.html: src/content/en/til/2020/09/04/cli-email-fun-profit.comments src/content/en/til/2020/09/05/oldschool-pr.html: src/content/en/til/2020/09/05/oldschool-pr.comments src/content/en/til/2020/10/11/search-git-history.html: src/content/en/til/2020/10/11/search-git-history.comments src/content/en/til/2020/11/08/find-broken-symlink.html: src/content/en/til/2020/11/08/find-broken-symlink.comments src/content/en/til/2020/11/12/diy-nix-bash-ci.html: src/content/en/til/2020/11/12/diy-nix-bash-ci.comments src/content/en/til/2020/11/12/git-bisect-automation.html: src/content/en/til/2020/11/12/git-bisect-automation.comments src/content/en/til/2020/11/12/useful-bashvars.html: src/content/en/til/2020/11/12/useful-bashvars.comments src/content/en/til/2020/11/14/gpodder-media.html: src/content/en/til/2020/11/14/gpodder-media.comments src/content/en/til/2020/11/30/git-notes-ci.html: src/content/en/til/2020/11/30/git-notes-ci.comments src/content/en/til/2020/12/15/shellcheck-repo.html: src/content/en/til/2020/12/15/shellcheck-repo.comments src/content/en/til/2020/12/29/svg.html: src/content/en/til/2020/12/29/svg.comments src/content/en/til/2021/01/12/curl-awk-emails.html: src/content/en/til/2021/01/12/curl-awk-emails.comments src/content/en/til/2021/01/17/posix-shebang.html: src/content/en/til/2021/01/17/posix-shebang.comments src/content/en/til/2021/04/24/cl-generic-precedence.html: src/content/en/til/2021/04/24/cl-generic-precedence.comments src/content/en/til/2021/04/24/clojure-autocurry.html: src/content/en/til/2021/04/24/clojure-autocurry.comments src/content/en/til/2021/04/24/scm-nif.html: src/content/en/til/2021/04/24/scm-nif.comments src/content/en/til/2021/07/23/git-tls-gpg.html: src/content/en/til/2021/07/23/git-tls-gpg.comments src/content/en/til/2021/08/11/js-bigint-reviver.html: src/content/en/til/2021/08/11/js-bigint-reviver.comments src/content/en/til/2026/09/05/multiline-sh-comments.html: src/content/en/til/2026/09/05/multiline-sh-comments.comments src/content/pt/hea/2020/08/12/arquivo-datado.html: src/content/pt/hea/2020/08/12/arquivo-datado.comments src/content/en/blog/index.html: src/content/en/blog/index.comments src/content/en/pastebin/index.html: src/content/en/pastebin/index.comments src/content/en/podcast/index.html: src/content/en/podcast/index.comments src/content/en/screencast/index.html: src/content/en/screencast/index.comments src/content/en/slide/index.html: src/content/en/slide/index.comments src/content/en/til/index.html: src/content/en/til/index.comments src/content/pt/hea/index.html: src/content/pt/hea/index.comments src/content/en/blog/categories.html: src/content/en/blog/categories.comments src/content/en/pastebin/categories.html: src/content/en/pastebin/categories.comments src/content/en/podcast/categories.html: src/content/en/podcast/categories.comments src/content/en/screencast/categories.html: src/content/en/screencast/categories.comments src/content/en/slide/categories.html: src/content/en/slide/categories.comments src/content/en/til/categories.html: src/content/en/til/categories.comments src/content/pt/hea/categorias.html: src/content/pt/hea/categorias.comments src/content/en/index.html: src/content/en/index.comments src/content/eo/index.html: src/content/eo/index.comments src/content/es/index.html: src/content/es/index.comments src/content/fr/index.html: src/content/fr/index.comments src/content/pt/index.html: src/content/pt/index.comments src/content/en/blog/2018/07/17/guix-nixos.categorydata: src/content/en/blog/2018/07/17/guix-nixos.json src/content/en/blog/2018/08/01/npm-ci-reproducibility.categorydata: src/content/en/blog/2018/08/01/npm-ci-reproducibility.json src/content/en/blog/2018/12/21/ytdl-subs.categorydata: src/content/en/blog/2018/12/21/ytdl-subs.json src/content/en/blog/2019/06/02/nixos-stateless-workstation.categorydata: src/content/en/blog/2019/06/02/nixos-stateless-workstation.json src/content/en/blog/2020/08/10/guix-srht.categorydata: src/content/en/blog/2020/08/10/guix-srht.json src/content/en/blog/2020/08/31/database-i-wish-i-had.categorydata: src/content/en/blog/2020/08/31/database-i-wish-i-had.json src/content/en/blog/2020/10/05/cargo2nix.categorydata: src/content/en/blog/2020/10/05/cargo2nix.json src/content/en/blog/2020/10/05/swift2nix.categorydata: src/content/en/blog/2020/10/05/swift2nix.json src/content/en/blog/2020/10/19/feature-flags.categorydata: src/content/en/blog/2020/10/19/feature-flags.json src/content/en/blog/2020/10/20/wrong-interviewing.categorydata: src/content/en/blog/2020/10/20/wrong-interviewing.json src/content/en/blog/2020/11/07/diy-bugs.categorydata: src/content/en/blog/2020/11/07/diy-bugs.json src/content/en/blog/2020/11/08/paradigm-shift-review.categorydata: src/content/en/blog/2020/11/08/paradigm-shift-review.json src/content/en/blog/2020/11/12/database-parsers-trees.categorydata: src/content/en/blog/2020/11/12/database-parsers-trees.json src/content/en/blog/2020/11/14/local-first-review.categorydata: src/content/en/blog/2020/11/14/local-first-review.json src/content/en/blog/2021/01/26/remembering-ann.categorydata: src/content/en/blog/2021/01/26/remembering-ann.json src/content/en/blog/2021/02/17/fallible.categorydata: src/content/en/blog/2021/02/17/fallible.json src/content/en/blog/2021/04/29/relational-review.categorydata: src/content/en/blog/2021/04/29/relational-review.json src/content/en/pastebin/2016/04/05/rpn.categorydata: src/content/en/pastebin/2016/04/05/rpn.json src/content/en/pastebin/2018/07/11/nix-pinning.categorydata: src/content/en/pastebin/2018/07/11/nix-pinning.json src/content/en/pastebin/2018/07/13/guix-nixos-systemd.categorydata: src/content/en/pastebin/2018/07/13/guix-nixos-systemd.json src/content/en/pastebin/2018/07/13/guixbuilder-nixos.categorydata: src/content/en/pastebin/2018/07/13/guixbuilder-nixos.json src/content/en/pastebin/2018/07/13/guixbuilder.categorydata: src/content/en/pastebin/2018/07/13/guixbuilder.json src/content/en/pastebin/2018/07/13/nix-strpad.categorydata: src/content/en/pastebin/2018/07/13/nix-strpad.json src/content/en/pastebin/2018/07/25/nix-exps.categorydata: src/content/en/pastebin/2018/07/25/nix-exps.json src/content/en/pastebin/2018/07/25/nix-showdrv.categorydata: src/content/en/pastebin/2018/07/25/nix-showdrv.json src/content/en/pastebin/2019/06/08/inconsistent-hash.categorydata: src/content/en/pastebin/2019/06/08/inconsistent-hash.json src/content/en/pastebin/2019/12/29/raku-tuple-type.categorydata: src/content/en/pastebin/2019/12/29/raku-tuple-type.json src/content/en/pastebin/2020/01/04/guix-import-failure.categorydata: src/content/en/pastebin/2020/01/04/guix-import-failure.json src/content/en/pastebin/2020/02/14/guix-shebang.categorydata: src/content/en/pastebin/2020/02/14/guix-shebang.json src/content/en/pastebin/2020/11/27/guix-build-local.categorydata: src/content/en/pastebin/2020/11/27/guix-build-local.json src/content/en/pastebin/2020/12/15/guix-pack-fail.categorydata: src/content/en/pastebin/2020/12/15/guix-pack-fail.json src/content/en/pastebin/2021/04/03/naive-slugify-js.categorydata: src/content/en/pastebin/2021/04/03/naive-slugify-js.json src/content/en/pastebin/2021/06/08/reading-session-pt1.categorydata: src/content/en/pastebin/2021/06/08/reading-session-pt1.json src/content/en/pastebin/2021/06/22/curl-wget.categorydata: src/content/en/pastebin/2021/06/22/curl-wget.json src/content/en/pastebin/2021/08/11/h1-spacing.categorydata: src/content/en/pastebin/2021/08/11/h1-spacing.json src/content/en/pastebin/2021/09/02/sicp-3-19.categorydata: src/content/en/pastebin/2021/09/02/sicp-3-19.json src/content/en/pastebin/2021/09/03/sicp-persistent-queue.categorydata: src/content/en/pastebin/2021/09/03/sicp-persistent-queue.json src/content/en/pastebin/2022/07/14/git-cleanup.categorydata: src/content/en/pastebin/2022/07/14/git-cleanup.json src/content/en/pastebin/2023/07/22/funcallable-amop.categorydata: src/content/en/pastebin/2023/07/22/funcallable-amop.json src/content/en/podcast/2020/12/19/test-entry.categorydata: src/content/en/podcast/2020/12/19/test-entry.json src/content/en/screencast/2021/02/07/autoqemu.categorydata: src/content/en/screencast/2021/02/07/autoqemu.json src/content/en/slide/2020/10/19/feature-flags.categorydata: src/content/en/slide/2020/10/19/feature-flags.json src/content/en/slide/2020/11/14/local-first-hype.categorydata: src/content/en/slide/2020/11/14/local-first-hype.json src/content/en/til/2020/08/12/filename-timestamp.categorydata: src/content/en/til/2020/08/12/filename-timestamp.json src/content/en/til/2020/08/13/code-jekyll.categorydata: src/content/en/til/2020/08/13/code-jekyll.json src/content/en/til/2020/08/14/browse-git.categorydata: src/content/en/til/2020/08/14/browse-git.json src/content/en/til/2020/08/16/git-search.categorydata: src/content/en/til/2020/08/16/git-search.json src/content/en/til/2020/08/28/grep-online.categorydata: src/content/en/til/2020/08/28/grep-online.json src/content/en/til/2020/09/04/cli-email-fun-profit.categorydata: src/content/en/til/2020/09/04/cli-email-fun-profit.json src/content/en/til/2020/09/05/oldschool-pr.categorydata: src/content/en/til/2020/09/05/oldschool-pr.json src/content/en/til/2020/10/11/search-git-history.categorydata: src/content/en/til/2020/10/11/search-git-history.json src/content/en/til/2020/11/08/find-broken-symlink.categorydata: src/content/en/til/2020/11/08/find-broken-symlink.json src/content/en/til/2020/11/12/diy-nix-bash-ci.categorydata: src/content/en/til/2020/11/12/diy-nix-bash-ci.json src/content/en/til/2020/11/12/git-bisect-automation.categorydata: src/content/en/til/2020/11/12/git-bisect-automation.json src/content/en/til/2020/11/12/useful-bashvars.categorydata: src/content/en/til/2020/11/12/useful-bashvars.json src/content/en/til/2020/11/14/gpodder-media.categorydata: src/content/en/til/2020/11/14/gpodder-media.json src/content/en/til/2020/11/30/git-notes-ci.categorydata: src/content/en/til/2020/11/30/git-notes-ci.json src/content/en/til/2020/12/15/shellcheck-repo.categorydata: src/content/en/til/2020/12/15/shellcheck-repo.json src/content/en/til/2020/12/29/svg.categorydata: src/content/en/til/2020/12/29/svg.json src/content/en/til/2021/01/12/curl-awk-emails.categorydata: src/content/en/til/2021/01/12/curl-awk-emails.json src/content/en/til/2021/01/17/posix-shebang.categorydata: src/content/en/til/2021/01/17/posix-shebang.json src/content/en/til/2021/04/24/cl-generic-precedence.categorydata: src/content/en/til/2021/04/24/cl-generic-precedence.json src/content/en/til/2021/04/24/clojure-autocurry.categorydata: src/content/en/til/2021/04/24/clojure-autocurry.json src/content/en/til/2021/04/24/scm-nif.categorydata: src/content/en/til/2021/04/24/scm-nif.json src/content/en/til/2021/07/23/git-tls-gpg.categorydata: src/content/en/til/2021/07/23/git-tls-gpg.json src/content/en/til/2021/08/11/js-bigint-reviver.categorydata: src/content/en/til/2021/08/11/js-bigint-reviver.json src/content/en/til/2026/09/05/multiline-sh-comments.categorydata: src/content/en/til/2026/09/05/multiline-sh-comments.json src/content/pt/hea/2020/08/12/arquivo-datado.categorydata: src/content/pt/hea/2020/08/12/arquivo-datado.json src/content/en/blog/index.htmlheader src/content/en/blog/index.htmlfooter: src/content/en/blog/index.json src/content/en/pastebin/index.htmlheader src/content/en/pastebin/index.htmlfooter: src/content/en/pastebin/index.json src/content/en/podcast/index.htmlheader src/content/en/podcast/index.htmlfooter: src/content/en/podcast/index.json src/content/en/screencast/index.htmlheader src/content/en/screencast/index.htmlfooter: src/content/en/screencast/index.json src/content/en/slide/index.htmlheader src/content/en/slide/index.htmlfooter: src/content/en/slide/index.json src/content/en/til/index.htmlheader src/content/en/til/index.htmlfooter: src/content/en/til/index.json src/content/pt/hea/index.htmlheader src/content/pt/hea/index.htmlfooter: src/content/pt/hea/index.json src/content/en/blog/categories.htmlheader src/content/en/blog/categories.htmlfooter: src/content/en/blog/categories.json src/content/en/pastebin/categories.htmlheader src/content/en/pastebin/categories.htmlfooter: src/content/en/pastebin/categories.json src/content/en/podcast/categories.htmlheader src/content/en/podcast/categories.htmlfooter: src/content/en/podcast/categories.json src/content/en/screencast/categories.htmlheader src/content/en/screencast/categories.htmlfooter: src/content/en/screencast/categories.json src/content/en/slide/categories.htmlheader src/content/en/slide/categories.htmlfooter: src/content/en/slide/categories.json src/content/en/til/categories.htmlheader src/content/en/til/categories.htmlfooter: src/content/en/til/categories.json src/content/pt/hea/categorias.htmlheader src/content/pt/hea/categorias.htmlfooter: src/content/pt/hea/categorias.json src/content/en/index.htmlheader src/content/en/index.htmlfooter: src/content/en/index.json src/content/eo/index.htmlheader src/content/eo/index.htmlfooter: src/content/eo/index.json src/content/es/index.htmlheader src/content/es/index.htmlfooter: src/content/es/index.json src/content/fr/index.htmlheader src/content/fr/index.htmlfooter: src/content/fr/index.json src/content/pt/index.htmlheader src/content/pt/index.htmlfooter: src/content/pt/index.json src/content/en/blog/index.htmllisting: src/content/en/blog/index.json src/content/en/pastebin/index.htmllisting: src/content/en/pastebin/index.json src/content/en/podcast/index.htmllisting: src/content/en/podcast/index.json src/content/en/screencast/index.htmllisting: src/content/en/screencast/index.json src/content/en/slide/index.htmllisting: src/content/en/slide/index.json src/content/en/til/index.htmllisting: src/content/en/til/index.json src/content/pt/hea/index.htmllisting: src/content/pt/hea/index.json src/content/en/blog/categories.htmllisting: src/content/en/blog/categories.json src/content/en/pastebin/categories.htmllisting: src/content/en/pastebin/categories.json src/content/en/podcast/categories.htmllisting: src/content/en/podcast/categories.json src/content/en/screencast/categories.htmllisting: src/content/en/screencast/categories.json src/content/en/slide/categories.htmllisting: src/content/en/slide/categories.json src/content/en/til/categories.htmllisting: src/content/en/til/categories.json src/content/pt/hea/categorias.htmllisting: src/content/pt/hea/categorias.json src/content/en/index.htmllisting: src/content/en/index.json src/content/eo/index.htmllisting: src/content/eo/index.json src/content/es/index.htmllisting: src/content/es/index.json src/content/fr/index.htmllisting: src/content/fr/index.json src/content/pt/index.htmllisting: src/content/pt/index.json src/content/en/blog/index.html: src/content/en/blog/index.htmlheader src/content/en/blog/index.htmlfooter src/content/en/pastebin/index.html: src/content/en/pastebin/index.htmlheader src/content/en/pastebin/index.htmlfooter src/content/en/podcast/index.html: src/content/en/podcast/index.htmlheader src/content/en/podcast/index.htmlfooter src/content/en/screencast/index.html: src/content/en/screencast/index.htmlheader src/content/en/screencast/index.htmlfooter src/content/en/slide/index.html: src/content/en/slide/index.htmlheader src/content/en/slide/index.htmlfooter src/content/en/til/index.html: src/content/en/til/index.htmlheader src/content/en/til/index.htmlfooter src/content/pt/hea/index.html: src/content/pt/hea/index.htmlheader src/content/pt/hea/index.htmlfooter src/content/en/blog/categories.html: src/content/en/blog/categories.htmlheader src/content/en/blog/categories.htmlfooter src/content/en/pastebin/categories.html: src/content/en/pastebin/categories.htmlheader src/content/en/pastebin/categories.htmlfooter src/content/en/podcast/categories.html: src/content/en/podcast/categories.htmlheader src/content/en/podcast/categories.htmlfooter src/content/en/screencast/categories.html: src/content/en/screencast/categories.htmlheader src/content/en/screencast/categories.htmlfooter src/content/en/slide/categories.html: src/content/en/slide/categories.htmlheader src/content/en/slide/categories.htmlfooter src/content/en/til/categories.html: src/content/en/til/categories.htmlheader src/content/en/til/categories.htmlfooter src/content/pt/hea/categorias.html: src/content/pt/hea/categorias.htmlheader src/content/pt/hea/categorias.htmlfooter src/content/en/index.html: src/content/en/index.htmlheader src/content/en/index.htmlfooter src/content/eo/index.html: src/content/eo/index.htmlheader src/content/eo/index.htmlfooter src/content/es/index.html: src/content/es/index.htmlheader src/content/es/index.htmlfooter src/content/fr/index.html: src/content/fr/index.htmlheader src/content/fr/index.htmlfooter src/content/pt/index.html: src/content/pt/index.htmlheader src/content/pt/index.htmlfooter src/content/en/blog/index.html: src/content/en/blog/index.htmllisting src/content/en/blog/index.htmlbody src/content/en/pastebin/index.html: src/content/en/pastebin/index.htmllisting src/content/en/pastebin/index.htmlbody src/content/en/podcast/index.html: src/content/en/podcast/index.htmllisting src/content/en/podcast/index.htmlbody src/content/en/screencast/index.html: src/content/en/screencast/index.htmllisting src/content/en/screencast/index.htmlbody src/content/en/slide/index.html: src/content/en/slide/index.htmllisting src/content/en/slide/index.htmlbody src/content/en/til/index.html: src/content/en/til/index.htmllisting src/content/en/til/index.htmlbody src/content/pt/hea/index.html: src/content/pt/hea/index.htmllisting src/content/pt/hea/index.htmlbody src/content/en/blog/categories.html: src/content/en/blog/categories.htmllisting src/content/en/blog/categories.htmlbody src/content/en/pastebin/categories.html: src/content/en/pastebin/categories.htmllisting src/content/en/pastebin/categories.htmlbody src/content/en/podcast/categories.html: src/content/en/podcast/categories.htmllisting src/content/en/podcast/categories.htmlbody src/content/en/screencast/categories.html: src/content/en/screencast/categories.htmllisting src/content/en/screencast/categories.htmlbody src/content/en/slide/categories.html: src/content/en/slide/categories.htmllisting src/content/en/slide/categories.htmlbody src/content/en/til/categories.html: src/content/en/til/categories.htmllisting src/content/en/til/categories.htmlbody src/content/pt/hea/categorias.html: src/content/pt/hea/categorias.htmllisting src/content/pt/hea/categorias.htmlbody src/content/en/index.html: src/content/en/index.htmllisting src/content/en/index.htmlbody src/content/eo/index.html: src/content/eo/index.htmllisting src/content/eo/index.htmlbody src/content/es/index.html: src/content/es/index.htmllisting src/content/es/index.htmlbody src/content/fr/index.html: src/content/fr/index.htmllisting src/content/fr/index.htmlbody src/content/pt/index.html: src/content/pt/index.htmllisting src/content/pt/index.htmlbody src/content/en/podcast/2020/12/19/test-entry.flac.torrent: src/content/en/podcast/2020/12/19/test-entry.flac src/content/en/podcast/2020/12/19/test-entry.ogg.torrent: src/content/en/podcast/2020/12/19/test-entry.ogg src/content/en/screencast/2021/02/07/autoqemu.webm.torrent: src/content/en/screencast/2021/02/07/autoqemu.webm src/content/en/slide/2020/10/19/feature-flags.ps: src/content/en/slide/2020/10/19/feature-flags.eslaides src/content/en/slide/2020/11/14/local-first-hype.ps: src/content/en/slide/2020/11/14/local-first-hype.eslaides src/content/en/slide/2020/10/19/feature-flags.pdf: src/content/en/slide/2020/10/19/feature-flags.ps src/content/en/slide/2020/11/14/local-first-hype.pdf: src/content/en/slide/2020/11/14/local-first-hype.ps articles.en.blog.adoc = \ src/content/en/blog/2018/07/17/guix-nixos.adoc \ src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc \ src/content/en/blog/2018/12/21/ytdl-subs.adoc \ src/content/en/blog/2019/06/02/nixos-stateless-workstation.adoc \ src/content/en/blog/2020/08/10/guix-srht.adoc \ src/content/en/blog/2020/08/31/database-i-wish-i-had.adoc \ src/content/en/blog/2020/10/05/cargo2nix.adoc \ src/content/en/blog/2020/10/05/swift2nix.adoc \ src/content/en/blog/2020/10/19/feature-flags.adoc \ src/content/en/blog/2020/10/20/wrong-interviewing.adoc \ src/content/en/blog/2020/11/07/diy-bugs.adoc \ src/content/en/blog/2020/11/08/paradigm-shift-review.adoc \ src/content/en/blog/2020/11/12/database-parsers-trees.adoc \ src/content/en/blog/2020/11/14/local-first-review.adoc \ src/content/en/blog/2021/01/26/remembering-ann.adoc \ src/content/en/blog/2021/02/17/fallible.adoc \ src/content/en/blog/2021/04/29/relational-review.adoc \ articles.en.blog.sortdata = $(articles.en.blog.adoc:.adoc=.sortdata) articles.en.blog.indexentry = $(articles.en.blog.adoc:.adoc=.indexentry) articles.en.blog.feedentry = $(articles.en.blog.adoc:.adoc=.feedentry) articles.en.blog.categorydata = $(articles.en.blog.adoc:.adoc=.categorydata) articles.en.blog.prevnext = $(articles.en.blog.adoc:.adoc=.prevnext) articles.en.blog.homeentry = $(articles.en.blog.adoc:.adoc=.homeentry) src/content/en/blog/2021/04/29/relational-review.prevnext: src/global.json src/content/en/blog/2021/02/17/fallible.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2021/02/17/fallible.json src/global.json > $@ src/content/en/blog/2021/02/17/fallible.prevnext: src/global.json src/content/en/blog/2021/01/26/remembering-ann.json src/content/en/blog/2021/04/29/relational-review.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2021/01/26/remembering-ann.json -n src/content/en/blog/2021/04/29/relational-review.json src/global.json > $@ src/content/en/blog/2021/01/26/remembering-ann.prevnext: src/global.json src/content/en/blog/2020/11/14/local-first-review.json src/content/en/blog/2021/02/17/fallible.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2020/11/14/local-first-review.json -n src/content/en/blog/2021/02/17/fallible.json src/global.json > $@ src/content/en/blog/2020/11/14/local-first-review.prevnext: src/global.json src/content/en/blog/2020/11/12/database-parsers-trees.json src/content/en/blog/2021/01/26/remembering-ann.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2020/11/12/database-parsers-trees.json -n src/content/en/blog/2021/01/26/remembering-ann.json src/global.json > $@ src/content/en/blog/2020/11/12/database-parsers-trees.prevnext: src/global.json src/content/en/blog/2020/11/08/paradigm-shift-review.json src/content/en/blog/2020/11/14/local-first-review.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2020/11/08/paradigm-shift-review.json -n src/content/en/blog/2020/11/14/local-first-review.json src/global.json > $@ src/content/en/blog/2020/11/08/paradigm-shift-review.prevnext: src/global.json src/content/en/blog/2020/11/07/diy-bugs.json src/content/en/blog/2020/11/12/database-parsers-trees.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2020/11/07/diy-bugs.json -n src/content/en/blog/2020/11/12/database-parsers-trees.json src/global.json > $@ src/content/en/blog/2020/11/07/diy-bugs.prevnext: src/global.json src/content/en/blog/2020/10/20/wrong-interviewing.json src/content/en/blog/2020/11/08/paradigm-shift-review.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2020/10/20/wrong-interviewing.json -n src/content/en/blog/2020/11/08/paradigm-shift-review.json src/global.json > $@ src/content/en/blog/2020/10/20/wrong-interviewing.prevnext: src/global.json src/content/en/blog/2020/10/19/feature-flags.json src/content/en/blog/2020/11/07/diy-bugs.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2020/10/19/feature-flags.json -n src/content/en/blog/2020/11/07/diy-bugs.json src/global.json > $@ src/content/en/blog/2020/10/19/feature-flags.prevnext: src/global.json src/content/en/blog/2020/10/05/cargo2nix.json src/content/en/blog/2020/10/20/wrong-interviewing.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2020/10/05/cargo2nix.json -n src/content/en/blog/2020/10/20/wrong-interviewing.json src/global.json > $@ src/content/en/blog/2020/10/05/cargo2nix.prevnext: src/global.json src/content/en/blog/2020/10/05/swift2nix.json src/content/en/blog/2020/10/19/feature-flags.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2020/10/05/swift2nix.json -n src/content/en/blog/2020/10/19/feature-flags.json src/global.json > $@ src/content/en/blog/2020/10/05/swift2nix.prevnext: src/global.json src/content/en/blog/2020/08/31/database-i-wish-i-had.json src/content/en/blog/2020/10/05/cargo2nix.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2020/08/31/database-i-wish-i-had.json -n src/content/en/blog/2020/10/05/cargo2nix.json src/global.json > $@ src/content/en/blog/2020/08/31/database-i-wish-i-had.prevnext: src/global.json src/content/en/blog/2020/08/10/guix-srht.json src/content/en/blog/2020/10/05/swift2nix.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2020/08/10/guix-srht.json -n src/content/en/blog/2020/10/05/swift2nix.json src/global.json > $@ src/content/en/blog/2020/08/10/guix-srht.prevnext: src/global.json src/content/en/blog/2019/06/02/nixos-stateless-workstation.json src/content/en/blog/2020/08/31/database-i-wish-i-had.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2019/06/02/nixos-stateless-workstation.json -n src/content/en/blog/2020/08/31/database-i-wish-i-had.json src/global.json > $@ src/content/en/blog/2019/06/02/nixos-stateless-workstation.prevnext: src/global.json src/content/en/blog/2018/12/21/ytdl-subs.json src/content/en/blog/2020/08/10/guix-srht.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2018/12/21/ytdl-subs.json -n src/content/en/blog/2020/08/10/guix-srht.json src/global.json > $@ src/content/en/blog/2018/12/21/ytdl-subs.prevnext: src/global.json src/content/en/blog/2018/08/01/npm-ci-reproducibility.json src/content/en/blog/2019/06/02/nixos-stateless-workstation.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2018/08/01/npm-ci-reproducibility.json -n src/content/en/blog/2019/06/02/nixos-stateless-workstation.json src/global.json > $@ src/content/en/blog/2018/08/01/npm-ci-reproducibility.prevnext: src/global.json src/content/en/blog/2018/07/17/guix-nixos.json src/content/en/blog/2018/12/21/ytdl-subs.json mkdir -p $(@D) mkwb prevnext -p src/content/en/blog/2018/07/17/guix-nixos.json -n src/content/en/blog/2018/12/21/ytdl-subs.json src/global.json > $@ src/content/en/blog/2018/07/17/guix-nixos.prevnext: src/global.json src/content/en/blog/2018/08/01/npm-ci-reproducibility.json mkdir -p $(@D) mkwb prevnext -n src/content/en/blog/2018/08/01/npm-ci-reproducibility.json src/global.json > $@ src/content/en/blog/sortdata.txt: deps.mk mkdir -p $(@D) printf '%s\n' $(articles.en.blog.sortdata) > $@ src/content/en/blog/feed.xml: src/content/en/blog/sortdata.txt src/content/en/blog/feed.xml: $(articles.en.blog.sortdata) src/content/en/blog/index.htmllisting: src/content/en/blog/sortdata.txt src/content/en/blog/index.htmllisting: $(articles.en.blog.sortdata) src/content/en/blog/categories.htmllisting: src/content/en/blog/sortdata.txt src/content/en/blog/categories.htmllisting: $(articles.en.blog.sortdata) src/content/en/blog/categories.txt: src/content/en/blog/sortdata.txt src/content/en/blog/categories.txt: $(articles.en.blog.sortdata) src/content/en/blog/index.htmllisting src/content/en/blog/categories.htmllisting: $(articles.en.blog.indexentry) src/content/en/blog/categories.txt: $(articles.en.blog.categorydata) src/content/en/blog/categories.txt src/content/en/blog/feed.xml: $(articles.en.blog.feedentry) src/content/en/blog/categories.htmllisting src/content/en/blog/categories.xml: src/content/en/blog/categories.txt articles.en.pastebin.adoc = \ src/content/en/pastebin/2016/04/05/rpn.adoc \ src/content/en/pastebin/2018/07/11/nix-pinning.adoc \ src/content/en/pastebin/2018/07/13/guix-nixos-systemd.adoc \ src/content/en/pastebin/2018/07/13/guixbuilder-nixos.adoc \ src/content/en/pastebin/2018/07/13/guixbuilder.adoc \ src/content/en/pastebin/2018/07/13/nix-strpad.adoc \ src/content/en/pastebin/2018/07/25/nix-exps.adoc \ src/content/en/pastebin/2018/07/25/nix-showdrv.adoc \ src/content/en/pastebin/2019/06/08/inconsistent-hash.adoc \ src/content/en/pastebin/2019/12/29/raku-tuple-type.adoc \ src/content/en/pastebin/2020/01/04/guix-import-failure.adoc \ src/content/en/pastebin/2020/02/14/guix-shebang.adoc \ src/content/en/pastebin/2020/11/27/guix-build-local.adoc \ src/content/en/pastebin/2020/12/15/guix-pack-fail.adoc \ src/content/en/pastebin/2021/04/03/naive-slugify-js.adoc \ src/content/en/pastebin/2021/06/08/reading-session-pt1.adoc \ src/content/en/pastebin/2021/06/22/curl-wget.adoc \ src/content/en/pastebin/2021/08/11/h1-spacing.adoc \ src/content/en/pastebin/2021/09/02/sicp-3-19.adoc \ src/content/en/pastebin/2021/09/03/sicp-persistent-queue.adoc \ src/content/en/pastebin/2022/07/14/git-cleanup.adoc \ src/content/en/pastebin/2023/07/22/funcallable-amop.adoc \ articles.en.pastebin.sortdata = $(articles.en.pastebin.adoc:.adoc=.sortdata) articles.en.pastebin.indexentry = $(articles.en.pastebin.adoc:.adoc=.indexentry) articles.en.pastebin.feedentry = $(articles.en.pastebin.adoc:.adoc=.feedentry) articles.en.pastebin.categorydata = $(articles.en.pastebin.adoc:.adoc=.categorydata) articles.en.pastebin.prevnext = $(articles.en.pastebin.adoc:.adoc=.prevnext) articles.en.pastebin.homeentry = $(articles.en.pastebin.adoc:.adoc=.homeentry) src/content/en/pastebin/2023/07/22/funcallable-amop.prevnext: src/global.json src/content/en/pastebin/2022/07/14/git-cleanup.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2022/07/14/git-cleanup.json src/global.json > $@ src/content/en/pastebin/2022/07/14/git-cleanup.prevnext: src/global.json src/content/en/pastebin/2021/09/03/sicp-persistent-queue.json src/content/en/pastebin/2023/07/22/funcallable-amop.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2021/09/03/sicp-persistent-queue.json -n src/content/en/pastebin/2023/07/22/funcallable-amop.json src/global.json > $@ src/content/en/pastebin/2021/09/03/sicp-persistent-queue.prevnext: src/global.json src/content/en/pastebin/2021/09/02/sicp-3-19.json src/content/en/pastebin/2022/07/14/git-cleanup.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2021/09/02/sicp-3-19.json -n src/content/en/pastebin/2022/07/14/git-cleanup.json src/global.json > $@ src/content/en/pastebin/2021/09/02/sicp-3-19.prevnext: src/global.json src/content/en/pastebin/2021/08/11/h1-spacing.json src/content/en/pastebin/2021/09/03/sicp-persistent-queue.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2021/08/11/h1-spacing.json -n src/content/en/pastebin/2021/09/03/sicp-persistent-queue.json src/global.json > $@ src/content/en/pastebin/2021/08/11/h1-spacing.prevnext: src/global.json src/content/en/pastebin/2021/06/22/curl-wget.json src/content/en/pastebin/2021/09/02/sicp-3-19.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2021/06/22/curl-wget.json -n src/content/en/pastebin/2021/09/02/sicp-3-19.json src/global.json > $@ src/content/en/pastebin/2021/06/22/curl-wget.prevnext: src/global.json src/content/en/pastebin/2021/06/08/reading-session-pt1.json src/content/en/pastebin/2021/08/11/h1-spacing.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2021/06/08/reading-session-pt1.json -n src/content/en/pastebin/2021/08/11/h1-spacing.json src/global.json > $@ src/content/en/pastebin/2021/06/08/reading-session-pt1.prevnext: src/global.json src/content/en/pastebin/2021/04/03/naive-slugify-js.json src/content/en/pastebin/2021/06/22/curl-wget.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2021/04/03/naive-slugify-js.json -n src/content/en/pastebin/2021/06/22/curl-wget.json src/global.json > $@ src/content/en/pastebin/2021/04/03/naive-slugify-js.prevnext: src/global.json src/content/en/pastebin/2020/12/15/guix-pack-fail.json src/content/en/pastebin/2021/06/08/reading-session-pt1.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2020/12/15/guix-pack-fail.json -n src/content/en/pastebin/2021/06/08/reading-session-pt1.json src/global.json > $@ src/content/en/pastebin/2020/12/15/guix-pack-fail.prevnext: src/global.json src/content/en/pastebin/2020/11/27/guix-build-local.json src/content/en/pastebin/2021/04/03/naive-slugify-js.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2020/11/27/guix-build-local.json -n src/content/en/pastebin/2021/04/03/naive-slugify-js.json src/global.json > $@ src/content/en/pastebin/2020/11/27/guix-build-local.prevnext: src/global.json src/content/en/pastebin/2020/02/14/guix-shebang.json src/content/en/pastebin/2020/12/15/guix-pack-fail.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2020/02/14/guix-shebang.json -n src/content/en/pastebin/2020/12/15/guix-pack-fail.json src/global.json > $@ src/content/en/pastebin/2020/02/14/guix-shebang.prevnext: src/global.json src/content/en/pastebin/2020/01/04/guix-import-failure.json src/content/en/pastebin/2020/11/27/guix-build-local.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2020/01/04/guix-import-failure.json -n src/content/en/pastebin/2020/11/27/guix-build-local.json src/global.json > $@ src/content/en/pastebin/2020/01/04/guix-import-failure.prevnext: src/global.json src/content/en/pastebin/2019/12/29/raku-tuple-type.json src/content/en/pastebin/2020/02/14/guix-shebang.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2019/12/29/raku-tuple-type.json -n src/content/en/pastebin/2020/02/14/guix-shebang.json src/global.json > $@ src/content/en/pastebin/2019/12/29/raku-tuple-type.prevnext: src/global.json src/content/en/pastebin/2019/06/08/inconsistent-hash.json src/content/en/pastebin/2020/01/04/guix-import-failure.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2019/06/08/inconsistent-hash.json -n src/content/en/pastebin/2020/01/04/guix-import-failure.json src/global.json > $@ src/content/en/pastebin/2019/06/08/inconsistent-hash.prevnext: src/global.json src/content/en/pastebin/2018/07/25/nix-showdrv.json src/content/en/pastebin/2019/12/29/raku-tuple-type.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2018/07/25/nix-showdrv.json -n src/content/en/pastebin/2019/12/29/raku-tuple-type.json src/global.json > $@ src/content/en/pastebin/2018/07/25/nix-showdrv.prevnext: src/global.json src/content/en/pastebin/2018/07/25/nix-exps.json src/content/en/pastebin/2019/06/08/inconsistent-hash.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2018/07/25/nix-exps.json -n src/content/en/pastebin/2019/06/08/inconsistent-hash.json src/global.json > $@ src/content/en/pastebin/2018/07/25/nix-exps.prevnext: src/global.json src/content/en/pastebin/2018/07/13/guix-nixos-systemd.json src/content/en/pastebin/2018/07/25/nix-showdrv.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2018/07/13/guix-nixos-systemd.json -n src/content/en/pastebin/2018/07/25/nix-showdrv.json src/global.json > $@ src/content/en/pastebin/2018/07/13/guix-nixos-systemd.prevnext: src/global.json src/content/en/pastebin/2018/07/13/guixbuilder-nixos.json src/content/en/pastebin/2018/07/25/nix-exps.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2018/07/13/guixbuilder-nixos.json -n src/content/en/pastebin/2018/07/25/nix-exps.json src/global.json > $@ src/content/en/pastebin/2018/07/13/guixbuilder-nixos.prevnext: src/global.json src/content/en/pastebin/2018/07/13/nix-strpad.json src/content/en/pastebin/2018/07/13/guix-nixos-systemd.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2018/07/13/nix-strpad.json -n src/content/en/pastebin/2018/07/13/guix-nixos-systemd.json src/global.json > $@ src/content/en/pastebin/2018/07/13/nix-strpad.prevnext: src/global.json src/content/en/pastebin/2018/07/13/guixbuilder.json src/content/en/pastebin/2018/07/13/guixbuilder-nixos.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2018/07/13/guixbuilder.json -n src/content/en/pastebin/2018/07/13/guixbuilder-nixos.json src/global.json > $@ src/content/en/pastebin/2018/07/13/guixbuilder.prevnext: src/global.json src/content/en/pastebin/2018/07/11/nix-pinning.json src/content/en/pastebin/2018/07/13/nix-strpad.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2018/07/11/nix-pinning.json -n src/content/en/pastebin/2018/07/13/nix-strpad.json src/global.json > $@ src/content/en/pastebin/2018/07/11/nix-pinning.prevnext: src/global.json src/content/en/pastebin/2016/04/05/rpn.json src/content/en/pastebin/2018/07/13/guixbuilder.json mkdir -p $(@D) mkwb prevnext -p src/content/en/pastebin/2016/04/05/rpn.json -n src/content/en/pastebin/2018/07/13/guixbuilder.json src/global.json > $@ src/content/en/pastebin/2016/04/05/rpn.prevnext: src/global.json src/content/en/pastebin/2018/07/11/nix-pinning.json mkdir -p $(@D) mkwb prevnext -n src/content/en/pastebin/2018/07/11/nix-pinning.json src/global.json > $@ src/content/en/pastebin/sortdata.txt: deps.mk mkdir -p $(@D) printf '%s\n' $(articles.en.pastebin.sortdata) > $@ src/content/en/pastebin/feed.xml: src/content/en/pastebin/sortdata.txt src/content/en/pastebin/feed.xml: $(articles.en.pastebin.sortdata) src/content/en/pastebin/index.htmllisting: src/content/en/pastebin/sortdata.txt src/content/en/pastebin/index.htmllisting: $(articles.en.pastebin.sortdata) src/content/en/pastebin/categories.htmllisting: src/content/en/pastebin/sortdata.txt src/content/en/pastebin/categories.htmllisting: $(articles.en.pastebin.sortdata) src/content/en/pastebin/categories.txt: src/content/en/pastebin/sortdata.txt src/content/en/pastebin/categories.txt: $(articles.en.pastebin.sortdata) src/content/en/pastebin/index.htmllisting src/content/en/pastebin/categories.htmllisting: $(articles.en.pastebin.indexentry) src/content/en/pastebin/categories.txt: $(articles.en.pastebin.categorydata) src/content/en/pastebin/categories.txt src/content/en/pastebin/feed.xml: $(articles.en.pastebin.feedentry) src/content/en/pastebin/categories.htmllisting src/content/en/pastebin/categories.xml: src/content/en/pastebin/categories.txt articles.en.podcast.adoc = \ src/content/en/podcast/2020/12/19/test-entry.adoc \ articles.en.podcast.sortdata = $(articles.en.podcast.adoc:.adoc=.sortdata) articles.en.podcast.indexentry = $(articles.en.podcast.adoc:.adoc=.indexentry) articles.en.podcast.feedentry = $(articles.en.podcast.adoc:.adoc=.feedentry) articles.en.podcast.categorydata = $(articles.en.podcast.adoc:.adoc=.categorydata) articles.en.podcast.prevnext = $(articles.en.podcast.adoc:.adoc=.prevnext) articles.en.podcast.homeentry = $(articles.en.podcast.adoc:.adoc=.homeentry) src/content/en/podcast/2020/12/19/test-entry.prevnext: src/global.json mkdir -p $(@D) mkwb prevnext src/global.json > $@ src/content/en/podcast/sortdata.txt: deps.mk mkdir -p $(@D) printf '%s\n' $(articles.en.podcast.sortdata) > $@ src/content/en/podcast/feed.xml: src/content/en/podcast/sortdata.txt src/content/en/podcast/feed.xml: $(articles.en.podcast.sortdata) src/content/en/podcast/index.htmllisting: src/content/en/podcast/sortdata.txt src/content/en/podcast/index.htmllisting: $(articles.en.podcast.sortdata) src/content/en/podcast/categories.htmllisting: src/content/en/podcast/sortdata.txt src/content/en/podcast/categories.htmllisting: $(articles.en.podcast.sortdata) src/content/en/podcast/categories.txt: src/content/en/podcast/sortdata.txt src/content/en/podcast/categories.txt: $(articles.en.podcast.sortdata) src/content/en/podcast/index.htmllisting src/content/en/podcast/categories.htmllisting: $(articles.en.podcast.indexentry) src/content/en/podcast/categories.txt: $(articles.en.podcast.categorydata) src/content/en/podcast/categories.txt src/content/en/podcast/feed.xml: $(articles.en.podcast.feedentry) src/content/en/podcast/categories.htmllisting src/content/en/podcast/categories.xml: src/content/en/podcast/categories.txt articles.en.screencast.adoc = \ src/content/en/screencast/2021/02/07/autoqemu.adoc \ articles.en.screencast.sortdata = $(articles.en.screencast.adoc:.adoc=.sortdata) articles.en.screencast.indexentry = $(articles.en.screencast.adoc:.adoc=.indexentry) articles.en.screencast.feedentry = $(articles.en.screencast.adoc:.adoc=.feedentry) articles.en.screencast.categorydata = $(articles.en.screencast.adoc:.adoc=.categorydata) articles.en.screencast.prevnext = $(articles.en.screencast.adoc:.adoc=.prevnext) articles.en.screencast.homeentry = $(articles.en.screencast.adoc:.adoc=.homeentry) src/content/en/screencast/2021/02/07/autoqemu.prevnext: src/global.json mkdir -p $(@D) mkwb prevnext src/global.json > $@ src/content/en/screencast/sortdata.txt: deps.mk mkdir -p $(@D) printf '%s\n' $(articles.en.screencast.sortdata) > $@ src/content/en/screencast/feed.xml: src/content/en/screencast/sortdata.txt src/content/en/screencast/feed.xml: $(articles.en.screencast.sortdata) src/content/en/screencast/index.htmllisting: src/content/en/screencast/sortdata.txt src/content/en/screencast/index.htmllisting: $(articles.en.screencast.sortdata) src/content/en/screencast/categories.htmllisting: src/content/en/screencast/sortdata.txt src/content/en/screencast/categories.htmllisting: $(articles.en.screencast.sortdata) src/content/en/screencast/categories.txt: src/content/en/screencast/sortdata.txt src/content/en/screencast/categories.txt: $(articles.en.screencast.sortdata) src/content/en/screencast/index.htmllisting src/content/en/screencast/categories.htmllisting: $(articles.en.screencast.indexentry) src/content/en/screencast/categories.txt: $(articles.en.screencast.categorydata) src/content/en/screencast/categories.txt src/content/en/screencast/feed.xml: $(articles.en.screencast.feedentry) src/content/en/screencast/categories.htmllisting src/content/en/screencast/categories.xml: src/content/en/screencast/categories.txt articles.en.slide.adoc = \ src/content/en/slide/2020/10/19/feature-flags.adoc \ src/content/en/slide/2020/11/14/local-first-hype.adoc \ articles.en.slide.sortdata = $(articles.en.slide.adoc:.adoc=.sortdata) articles.en.slide.indexentry = $(articles.en.slide.adoc:.adoc=.indexentry) articles.en.slide.feedentry = $(articles.en.slide.adoc:.adoc=.feedentry) articles.en.slide.categorydata = $(articles.en.slide.adoc:.adoc=.categorydata) articles.en.slide.prevnext = $(articles.en.slide.adoc:.adoc=.prevnext) articles.en.slide.homeentry = $(articles.en.slide.adoc:.adoc=.homeentry) src/content/en/slide/2020/11/14/local-first-hype.prevnext: src/global.json src/content/en/slide/2020/10/19/feature-flags.json mkdir -p $(@D) mkwb prevnext -p src/content/en/slide/2020/10/19/feature-flags.json src/global.json > $@ src/content/en/slide/2020/10/19/feature-flags.prevnext: src/global.json src/content/en/slide/2020/11/14/local-first-hype.json mkdir -p $(@D) mkwb prevnext -n src/content/en/slide/2020/11/14/local-first-hype.json src/global.json > $@ src/content/en/slide/sortdata.txt: deps.mk mkdir -p $(@D) printf '%s\n' $(articles.en.slide.sortdata) > $@ src/content/en/slide/feed.xml: src/content/en/slide/sortdata.txt src/content/en/slide/feed.xml: $(articles.en.slide.sortdata) src/content/en/slide/index.htmllisting: src/content/en/slide/sortdata.txt src/content/en/slide/index.htmllisting: $(articles.en.slide.sortdata) src/content/en/slide/categories.htmllisting: src/content/en/slide/sortdata.txt src/content/en/slide/categories.htmllisting: $(articles.en.slide.sortdata) src/content/en/slide/categories.txt: src/content/en/slide/sortdata.txt src/content/en/slide/categories.txt: $(articles.en.slide.sortdata) src/content/en/slide/index.htmllisting src/content/en/slide/categories.htmllisting: $(articles.en.slide.indexentry) src/content/en/slide/categories.txt: $(articles.en.slide.categorydata) src/content/en/slide/categories.txt src/content/en/slide/feed.xml: $(articles.en.slide.feedentry) src/content/en/slide/categories.htmllisting src/content/en/slide/categories.xml: src/content/en/slide/categories.txt articles.en.til.adoc = \ src/content/en/til/2020/08/12/filename-timestamp.adoc \ src/content/en/til/2020/08/13/code-jekyll.adoc \ src/content/en/til/2020/08/14/browse-git.adoc \ src/content/en/til/2020/08/16/git-search.adoc \ src/content/en/til/2020/08/28/grep-online.adoc \ src/content/en/til/2020/09/04/cli-email-fun-profit.adoc \ src/content/en/til/2020/09/05/oldschool-pr.adoc \ src/content/en/til/2020/10/11/search-git-history.adoc \ src/content/en/til/2020/11/08/find-broken-symlink.adoc \ src/content/en/til/2020/11/12/diy-nix-bash-ci.adoc \ src/content/en/til/2020/11/12/git-bisect-automation.adoc \ src/content/en/til/2020/11/12/useful-bashvars.adoc \ src/content/en/til/2020/11/14/gpodder-media.adoc \ src/content/en/til/2020/11/30/git-notes-ci.adoc \ src/content/en/til/2020/12/15/shellcheck-repo.adoc \ src/content/en/til/2020/12/29/svg.adoc \ src/content/en/til/2021/01/12/curl-awk-emails.adoc \ src/content/en/til/2021/01/17/posix-shebang.adoc \ src/content/en/til/2021/04/24/cl-generic-precedence.adoc \ src/content/en/til/2021/04/24/clojure-autocurry.adoc \ src/content/en/til/2021/04/24/scm-nif.adoc \ src/content/en/til/2021/07/23/git-tls-gpg.adoc \ src/content/en/til/2021/08/11/js-bigint-reviver.adoc \ src/content/en/til/2026/09/05/multiline-sh-comments.adoc \ articles.en.til.sortdata = $(articles.en.til.adoc:.adoc=.sortdata) articles.en.til.indexentry = $(articles.en.til.adoc:.adoc=.indexentry) articles.en.til.feedentry = $(articles.en.til.adoc:.adoc=.feedentry) articles.en.til.categorydata = $(articles.en.til.adoc:.adoc=.categorydata) articles.en.til.prevnext = $(articles.en.til.adoc:.adoc=.prevnext) articles.en.til.homeentry = $(articles.en.til.adoc:.adoc=.homeentry) src/content/en/til/2026/09/05/multiline-sh-comments.prevnext: src/global.json src/content/en/til/2021/08/11/js-bigint-reviver.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2021/08/11/js-bigint-reviver.json src/global.json > $@ src/content/en/til/2021/08/11/js-bigint-reviver.prevnext: src/global.json src/content/en/til/2021/07/23/git-tls-gpg.json src/content/en/til/2026/09/05/multiline-sh-comments.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2021/07/23/git-tls-gpg.json -n src/content/en/til/2026/09/05/multiline-sh-comments.json src/global.json > $@ src/content/en/til/2021/07/23/git-tls-gpg.prevnext: src/global.json src/content/en/til/2021/04/24/scm-nif.json src/content/en/til/2021/08/11/js-bigint-reviver.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2021/04/24/scm-nif.json -n src/content/en/til/2021/08/11/js-bigint-reviver.json src/global.json > $@ src/content/en/til/2021/04/24/scm-nif.prevnext: src/global.json src/content/en/til/2021/04/24/clojure-autocurry.json src/content/en/til/2021/07/23/git-tls-gpg.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2021/04/24/clojure-autocurry.json -n src/content/en/til/2021/07/23/git-tls-gpg.json src/global.json > $@ src/content/en/til/2021/04/24/clojure-autocurry.prevnext: src/global.json src/content/en/til/2021/04/24/cl-generic-precedence.json src/content/en/til/2021/04/24/scm-nif.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2021/04/24/cl-generic-precedence.json -n src/content/en/til/2021/04/24/scm-nif.json src/global.json > $@ src/content/en/til/2021/04/24/cl-generic-precedence.prevnext: src/global.json src/content/en/til/2021/01/17/posix-shebang.json src/content/en/til/2021/04/24/clojure-autocurry.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2021/01/17/posix-shebang.json -n src/content/en/til/2021/04/24/clojure-autocurry.json src/global.json > $@ src/content/en/til/2021/01/17/posix-shebang.prevnext: src/global.json src/content/en/til/2021/01/12/curl-awk-emails.json src/content/en/til/2021/04/24/cl-generic-precedence.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2021/01/12/curl-awk-emails.json -n src/content/en/til/2021/04/24/cl-generic-precedence.json src/global.json > $@ src/content/en/til/2021/01/12/curl-awk-emails.prevnext: src/global.json src/content/en/til/2020/12/29/svg.json src/content/en/til/2021/01/17/posix-shebang.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/12/29/svg.json -n src/content/en/til/2021/01/17/posix-shebang.json src/global.json > $@ src/content/en/til/2020/12/29/svg.prevnext: src/global.json src/content/en/til/2020/12/15/shellcheck-repo.json src/content/en/til/2021/01/12/curl-awk-emails.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/12/15/shellcheck-repo.json -n src/content/en/til/2021/01/12/curl-awk-emails.json src/global.json > $@ src/content/en/til/2020/12/15/shellcheck-repo.prevnext: src/global.json src/content/en/til/2020/11/30/git-notes-ci.json src/content/en/til/2020/12/29/svg.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/11/30/git-notes-ci.json -n src/content/en/til/2020/12/29/svg.json src/global.json > $@ src/content/en/til/2020/11/30/git-notes-ci.prevnext: src/global.json src/content/en/til/2020/11/14/gpodder-media.json src/content/en/til/2020/12/15/shellcheck-repo.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/11/14/gpodder-media.json -n src/content/en/til/2020/12/15/shellcheck-repo.json src/global.json > $@ src/content/en/til/2020/11/14/gpodder-media.prevnext: src/global.json src/content/en/til/2020/11/12/diy-nix-bash-ci.json src/content/en/til/2020/11/30/git-notes-ci.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/11/12/diy-nix-bash-ci.json -n src/content/en/til/2020/11/30/git-notes-ci.json src/global.json > $@ src/content/en/til/2020/11/12/diy-nix-bash-ci.prevnext: src/global.json src/content/en/til/2020/11/12/git-bisect-automation.json src/content/en/til/2020/11/14/gpodder-media.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/11/12/git-bisect-automation.json -n src/content/en/til/2020/11/14/gpodder-media.json src/global.json > $@ src/content/en/til/2020/11/12/git-bisect-automation.prevnext: src/global.json src/content/en/til/2020/11/12/useful-bashvars.json src/content/en/til/2020/11/12/diy-nix-bash-ci.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/11/12/useful-bashvars.json -n src/content/en/til/2020/11/12/diy-nix-bash-ci.json src/global.json > $@ src/content/en/til/2020/11/12/useful-bashvars.prevnext: src/global.json src/content/en/til/2020/11/08/find-broken-symlink.json src/content/en/til/2020/11/12/git-bisect-automation.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/11/08/find-broken-symlink.json -n src/content/en/til/2020/11/12/git-bisect-automation.json src/global.json > $@ src/content/en/til/2020/11/08/find-broken-symlink.prevnext: src/global.json src/content/en/til/2020/10/11/search-git-history.json src/content/en/til/2020/11/12/useful-bashvars.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/10/11/search-git-history.json -n src/content/en/til/2020/11/12/useful-bashvars.json src/global.json > $@ src/content/en/til/2020/10/11/search-git-history.prevnext: src/global.json src/content/en/til/2020/09/05/oldschool-pr.json src/content/en/til/2020/11/08/find-broken-symlink.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/09/05/oldschool-pr.json -n src/content/en/til/2020/11/08/find-broken-symlink.json src/global.json > $@ src/content/en/til/2020/09/05/oldschool-pr.prevnext: src/global.json src/content/en/til/2020/09/04/cli-email-fun-profit.json src/content/en/til/2020/10/11/search-git-history.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/09/04/cli-email-fun-profit.json -n src/content/en/til/2020/10/11/search-git-history.json src/global.json > $@ src/content/en/til/2020/09/04/cli-email-fun-profit.prevnext: src/global.json src/content/en/til/2020/08/28/grep-online.json src/content/en/til/2020/09/05/oldschool-pr.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/08/28/grep-online.json -n src/content/en/til/2020/09/05/oldschool-pr.json src/global.json > $@ src/content/en/til/2020/08/28/grep-online.prevnext: src/global.json src/content/en/til/2020/08/16/git-search.json src/content/en/til/2020/09/04/cli-email-fun-profit.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/08/16/git-search.json -n src/content/en/til/2020/09/04/cli-email-fun-profit.json src/global.json > $@ src/content/en/til/2020/08/16/git-search.prevnext: src/global.json src/content/en/til/2020/08/14/browse-git.json src/content/en/til/2020/08/28/grep-online.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/08/14/browse-git.json -n src/content/en/til/2020/08/28/grep-online.json src/global.json > $@ src/content/en/til/2020/08/14/browse-git.prevnext: src/global.json src/content/en/til/2020/08/13/code-jekyll.json src/content/en/til/2020/08/16/git-search.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/08/13/code-jekyll.json -n src/content/en/til/2020/08/16/git-search.json src/global.json > $@ src/content/en/til/2020/08/13/code-jekyll.prevnext: src/global.json src/content/en/til/2020/08/12/filename-timestamp.json src/content/en/til/2020/08/14/browse-git.json mkdir -p $(@D) mkwb prevnext -p src/content/en/til/2020/08/12/filename-timestamp.json -n src/content/en/til/2020/08/14/browse-git.json src/global.json > $@ src/content/en/til/2020/08/12/filename-timestamp.prevnext: src/global.json src/content/en/til/2020/08/13/code-jekyll.json mkdir -p $(@D) mkwb prevnext -n src/content/en/til/2020/08/13/code-jekyll.json src/global.json > $@ src/content/en/til/sortdata.txt: deps.mk mkdir -p $(@D) printf '%s\n' $(articles.en.til.sortdata) > $@ src/content/en/til/feed.xml: src/content/en/til/sortdata.txt src/content/en/til/feed.xml: $(articles.en.til.sortdata) src/content/en/til/index.htmllisting: src/content/en/til/sortdata.txt src/content/en/til/index.htmllisting: $(articles.en.til.sortdata) src/content/en/til/categories.htmllisting: src/content/en/til/sortdata.txt src/content/en/til/categories.htmllisting: $(articles.en.til.sortdata) src/content/en/til/categories.txt: src/content/en/til/sortdata.txt src/content/en/til/categories.txt: $(articles.en.til.sortdata) src/content/en/til/index.htmllisting src/content/en/til/categories.htmllisting: $(articles.en.til.indexentry) src/content/en/til/categories.txt: $(articles.en.til.categorydata) src/content/en/til/categories.txt src/content/en/til/feed.xml: $(articles.en.til.feedentry) src/content/en/til/categories.htmllisting src/content/en/til/categories.xml: src/content/en/til/categories.txt articles.pt.hea.adoc = \ src/content/pt/hea/2020/08/12/arquivo-datado.adoc \ articles.pt.hea.sortdata = $(articles.pt.hea.adoc:.adoc=.sortdata) articles.pt.hea.indexentry = $(articles.pt.hea.adoc:.adoc=.indexentry) articles.pt.hea.feedentry = $(articles.pt.hea.adoc:.adoc=.feedentry) articles.pt.hea.categorydata = $(articles.pt.hea.adoc:.adoc=.categorydata) articles.pt.hea.prevnext = $(articles.pt.hea.adoc:.adoc=.prevnext) articles.pt.hea.homeentry = $(articles.pt.hea.adoc:.adoc=.homeentry) src/content/pt/hea/2020/08/12/arquivo-datado.prevnext: src/global.json mkdir -p $(@D) mkwb prevnext src/global.json > $@ src/content/pt/hea/sortdata.txt: deps.mk mkdir -p $(@D) printf '%s\n' $(articles.pt.hea.sortdata) > $@ src/content/pt/hea/feed.xml: src/content/pt/hea/sortdata.txt src/content/pt/hea/feed.xml: $(articles.pt.hea.sortdata) src/content/pt/hea/index.htmllisting: src/content/pt/hea/sortdata.txt src/content/pt/hea/index.htmllisting: $(articles.pt.hea.sortdata) src/content/pt/hea/categorias.htmllisting: src/content/pt/hea/sortdata.txt src/content/pt/hea/categorias.htmllisting: $(articles.pt.hea.sortdata) src/content/pt/hea/categorias.txt: src/content/pt/hea/sortdata.txt src/content/pt/hea/categorias.txt: $(articles.pt.hea.sortdata) src/content/pt/hea/index.htmllisting src/content/pt/hea/categorias.htmllisting: $(articles.pt.hea.indexentry) src/content/pt/hea/categorias.txt: $(articles.pt.hea.categorydata) src/content/pt/hea/categorias.txt src/content/pt/hea/feed.xml: $(articles.pt.hea.feedentry) src/content/pt/hea/categorias.htmllisting src/content/pt/hea/categorias.xml: src/content/pt/hea/categorias.txt src/content/en/index.htmllisting: src/content/en/blog/sortdata.txt $(articles.en.blog.sortdata) $(articles.en.blog.homeentry) src/content/en/pastebin/sortdata.txt $(articles.en.pastebin.sortdata) $(articles.en.pastebin.homeentry) src/content/en/podcast/sortdata.txt $(articles.en.podcast.sortdata) $(articles.en.podcast.homeentry) src/content/en/screencast/sortdata.txt $(articles.en.screencast.sortdata) $(articles.en.screencast.homeentry) src/content/en/slide/sortdata.txt $(articles.en.slide.sortdata) $(articles.en.slide.homeentry) src/content/en/til/sortdata.txt $(articles.en.til.sortdata) $(articles.en.til.homeentry) src/content/pt/index.htmllisting: src/content/pt/hea/sortdata.txt $(articles.pt.hea.sortdata) $(articles.pt.hea.homeentry) translations = \ src/content/eo/index.adoc \ src/content/eo/pri.adoc \ src/content/es/acerca.adoc \ src/content/es/index.adoc \ src/content/fr/a-propos.adoc \ src/content/fr/index.adoc \ src/content/pt/hea/2020/08/12/arquivo-datado.adoc \ src/content/pt/hea/categorias.adoc \ src/content/pt/hea/index.adoc \ src/content/pt/index.adoc \ src/content/pt/sobre.adoc \ src/i18n.en.txt \ src/i18n.eo.txt \ src/i18n.es.txt \ src/i18n.fr.txt \ src/i18n.pt.txt \ src/i18n.stamp: po/po4a.cfg po/en.po po/eo.po po/es.po po/fr.po po/pt.po po4a po/po4a.cfg touch $@ $(translations): src/i18n.stamp translations.txt = src/translations.txt src/translations.txt: deps.mk printf '%s\n' \ 'src/content/en/index.adoc src/content/pt/index.adoc src/content/fr/index.adoc src/content/eo/index.adoc src/content/es/index.adoc' \ 'src/content/en/about.adoc src/content/pt/sobre.adoc src/content/fr/a-propos.adoc src/content/eo/pri.adoc src/content/es/acerca.adoc' \ 'src/content/en/til/index.adoc src/content/pt/hea/index.adoc' \ 'src/content/en/til/categories.adoc src/content/pt/hea/categorias.adoc' \ 'src/content/en/til/2020/08/12/filename-timestamp.adoc src/content/pt/hea/2020/08/12/arquivo-datado.adoc' \ > $@ ## mkwb canonical site rules. Sites consume this content by ## inlining it at the end of their generated deps.mk: mkdeps.sh ## runs "mkwb rules" (which prints them) so deps.mk ends up ## self-contained -- no make-time "include" of an external file. ## The site Makefile only needs an "all:" anchor followed by ## "include deps.mk". Order matters: "all:" must come first ## (otherwise deps.mk's first target becomes the default), and ## the canonical rules below must follow deps.mk's variable ## assignments so that "all: $(derived-assets)" can resolve its ## prereq list at parse time. ## ## The including Makefile is expected to define at minimum: ## ## NAME -- site name: the domain it is served from, since ## baseurl.txt is derived as https://$(NAME). Also ## used for the SRCDIR/HTMLDIR install paths. ## VERSION ## DATE ## ## The site must also provide one source file: ## ## src/config.json -- a flat JSON object of strings, the site's ## own settings laid over what mkwb derives. ## Only "email" is required of it, since ## nothing can be derived for the contact ## address; mkwb's defaults stand in for ## every other key it leaves out. ## ## To override any of PREFIX / BINDIR / SHAREDIR / SRCDIR / ## HTMLDIR / PUBURL / BASEURL / FFMFLAGS, set them AFTER the ## include (plain "=", POSIX -- no "?=" conditional assignment), ## or pass "-e" to make to let env vars take precedence. ## ## "clean", "install" and "uninstall" are the site's own, and ## pristine(1) looks for all three in the Makefile itself. The ## rules still name what they act on: "$(derived-assets)" and ## "$(side-assets)" are everything the build produced, and ## "install.txt" and "sources.txt" name what to carry, to the ## $(HTMLDIR) and $(SRCDIR) below. ## Default values. Sites override AFTER the include or via env. PREFIX = /usr BINDIR = $(PREFIX)/bin LIBDIR = $(PREFIX)/lib INCLUDEDIR = $(PREFIX)/include SHAREDIR = $(PREFIX)/share LOCALEDIR = $(SHAREDIR)/locale MANDIR = $(SHAREDIR)/man DOCDIR = $(SHAREDIR)/doc/$(NAME) HTMLDIR = $(SHAREDIR)/html/$(NAME) SRCDIR = $(PREFIX)/src/$(NAME) DESTDIR = ## How many of each collection a front page lists. HOMECOUNT = 3 PUBURL = public.asc.txt BASEURL = / FFMFLAGS = -y -hide_banner -loglevel warning .SUFFIXES: .SUFFIXES: .adoc .json .snippets .indexentry .feedentry .mapentry .sortdata .xml .SUFFIXES: .htmlbody .htmlheader .htmlfooter .htmllisting .html .links .caslinks .SUFFIXES: .comments .homeentry .SUFFIXES: .txt .categorydata .torrent .flac .ogg .ps .pdf .sentinel .SUFFIXES: .ly .midi .eslaides .adoc.json: mkwb conf src/global.json $< > $@ .adoc.htmlbody: mkwb htmlbody $< > $@ .htmlbody.html: mkwb html $< > $@ .json.htmlheader: mkwb html -H $< > $@ .json.htmlfooter: mkwb html -F $< > $@ .adoc.snippets: mkwb snippets $< > $@ .json.indexentry: mkwb indexentry $< > $@ ## The same entry, linked from the root of the language rather ## than the root of the collection, for a front page. .json.homeentry: mkwb indexentry -l $< > $@ .htmlbody.feedentry: mkwb feedentry $< > $@ .json.comments: mkwb comments $< > $@ .json.mapentry: mkwb mapentry $< > $@ .json.sortdata: mkwb sortdata $< > $@ .json.categorydata: mkwb categorydata $< > $@ .adoc.links: mkwb links $< > $@ .links.caslinks: mkwb caslinks $< > $@ .flac.ogg: ffmpeg $(FFMFLAGS) -i $< -ar 48000 -vn -c:a libvorbis -b:a 320k $@ .eslaides.ps: eslaides < $< > $@ .ly.midi: lilypond -o $* $< ## ghostscript stamps a PDF with the wall clock and a fresh uuid, ## so one deck rendered twice was two different files and every ## deploy shipped a slide nobody had touched. The dates are set ## ahead of the input by a DOCINFO pdfmark, and the two XMP uuids ## are named on the command line. -dOmitInfoDate does not reach ## either: it is honoured for an input carrying no pdfmarks of its ## own, and a deck carries plenty. .ps.pdf: { \ printf '%s\n' \ '[ /CreationDate (D:19700101000000Z)' \ '/ModDate (D:19700101000000Z) /DOCINFO pdfmark'; \ cat $<; \ } | ps2pdf \ -sDocumentUUID=00000000-0000-0000-0000-000000000000 \ -sInstanceUUID=00000000-0000-0000-0000-000000000000 \ - > $@ ## Derived file lists from auto-generated source lists in deps.mk. listings.adoc = $(categories.adoc) $(indexes.adoc) $(homes.adoc) homes.htmllisting = $(homes.adoc:.adoc=.htmllisting) sources.adoc = $(articles.adoc) $(listings.adoc) $(pages.adoc) sources.htmlbody = $(sources.adoc:.adoc=.htmlbody) sources.html = $(sources.adoc:.adoc=.html) sources.snippets = $(sources.adoc:.adoc=.snippets) sources.json = $(sources.adoc:.adoc=.json) sources.links = $(sources.adoc:.adoc=.links) sources.caslinks = $(sources.adoc:.adoc=.caslinks) sources.comments = $(sources.adoc:.adoc=.comments) sources.mapentry = $(sources.adoc:.adoc=.mapentry) articles.indexentry = $(articles.adoc:.adoc=.indexentry) articles.homeentry = $(articles.adoc:.adoc=.homeentry) articles.feedentry = $(articles.adoc:.adoc=.feedentry) articles.sortdata = $(articles.adoc:.adoc=.sortdata) articles.prevnext = $(articles.adoc:.adoc=.prevnext) articles.categorydata = $(articles.adoc:.adoc=.categorydata) listings.htmlheader = $(listings.adoc:.adoc=.htmlheader) listings.htmlfooter = $(listings.adoc:.adoc=.htmlfooter) listings.html = $(listings.adoc:.adoc=.html) indexes.htmllisting = $(indexes.adoc:.adoc=.htmllisting) categories.htmllisting = $(categories.adoc:.adoc=.htmllisting) categories.txt = $(categories.adoc:.adoc=.txt) categories.xml = $(categories.adoc:.adoc=.xml) sources.media.torrent = $(sources.media:=.torrent) music.midi = $(music.ly:.ly=.midi) music.pdf = $(music.ly:.ly=.pdf) slides.ps = $(slides.eslaides:.eslaides=.ps) slides.pdf = $(slides.eslaides:.eslaides=.pdf) sources = \ $(sources.adoc) \ $(sources.extras) \ $(images.svg) \ $(root.dir)/favicon.ico \ $(root.dir)/favicon.png \ $(root.dir)/style.css \ $(root.dir)/$(PUBURL) \ dynamic-contents = \ $(sources.html) \ $(slides.pdf) \ $(feeds.xml) \ $(sources.media.torrent) \ $(root.dir)/sitemap.xml \ static-contents = \ $(sources.extras) \ $(music.ly) \ $(music.include) \ $(music.ogg) \ $(music.midi) \ $(music.pdf) \ $(images.svg) \ $(root.dir)/favicon.ico \ $(root.dir)/favicon.png \ $(root.dir)/style.css \ $(root.dir)/$(PUBURL) \ $(root.dir)/.well-known/security.txt \ contents = \ $(dynamic-contents) \ $(static-contents) \ all-filelists = \ $(sources.snippets) \ $(categories.xml) \ all-contents = \ $(contents) \ ## What a rule writes through ifnew(1), beside a sentinel that ## records the writing: only the exported public key, now that the ## favicons are rendered straight to their own names. captured-assets = \ $(root.dir)/$(PUBURL) \ captured-assets.sentinel = $(captured-assets:=.sentinel) derived-assets = \ $(dynamic-contents) \ $(music.midi) \ $(music.pdf) \ $(sources.html) \ $(sources.htmlbody) \ $(sources.snippets) \ $(sources.json) \ $(sources.links) \ $(sources.caslinks) \ $(sources.comments) \ src/comments.sentinel \ $(sources.mapentry) \ src/global.json \ $(translations.txt) \ $(articles.indexentry) \ $(articles.homeentry) \ $(articles.feedentry) \ $(articles.sortdata) \ $(articles.prevnext) \ $(articles.categorydata) \ $(listings.htmlheader) \ $(listings.htmlfooter) \ $(listings.html) \ $(indexes.htmllisting) \ $(categories.htmllisting) \ $(homes.htmllisting) \ $(categories.txt) \ $(categories.xml) \ $(slides.ps) \ $(slides.pdf) \ baseurl.txt \ fingerprint.txt \ expiry.txt \ expiry-epoch.txt \ now.txt \ $(root.dir)/.well-known/security.txt \ src/all-contents.txt \ src/all-filelists.txt \ src/all-symlinks.txt \ src/install.txt \ src/sort-expected.txt \ src/sort-given.txt \ src/sources.txt \ install.txt \ sources.txt \ $(root.dir)/.gitignore \ $(captured-assets.sentinel) \ ## Artifacts whose names the rules never write down: a page's ## code blocks are numbered by however many it has, and sortdata ## is named for the date it carries. A glob would have to fix a ## depth, and a page may sit at any of them, so ask find. side-assets = \ $$(find $(root.dir) -name '*.html.*.txt' 2>/dev/null) \ $$(find $(root.dir) -name '*.sortdata' 2>/dev/null) \ $$(find $(root.dir) -name 'sortdata.txt' 2>/dev/null) \ $(root.dir)/*/*/feed.*.xml \ $(translations) \ src/i18n.stamp \ $(root.dir)/.well-known/ \ src/comments/ \ $$(cat src/all-symlinks.txt 2>/dev/null) \ install.tar \ sources.tar \ ## Default target -- builds all derived + captured artifacts. ## $(static-contents) is named too: most of it the site ships, but ## the fallback rules below craft what it doesn't (style.css, the ## favicon), and nothing else asks for those now that no .gz twin ## does. all: $(derived-assets) $(captured-assets) $(static-contents) all: install.tar sources.tar ## A page's configuration names the same page in the other ## languages, so it is built after the map that says which those ## are. A site with no translations sets no map, and the variable ## is empty. $(sources.json): src/global.json $(translations.txt) ## Optional inputs default to empty / stub when the site doesn't ## ship them, so make doesn't bail on a missing prerequisite. src/symlinks.txt: : > $@ ## The list archive as the list exports it, and the messages split ## out of it. One file is what gets committed; make cuts it up. ## The names are not known in advance, so a stamp stands for them. src/comments.mbox: : > $@ ## Where the split messages land and which file overrides them is ## the site's to say, so both come from its config rather than from ## here; a site that says nothing gets the defaults it always had. $(comments.map): mkdir -p $(@D) : > $@ src/comments.sentinel: src/comments.mbox mkwb mbox $(comments.dir) < src/comments.mbox > /dev/null touch $@ ## Comments that did not arrive as mail: one archive per place a ## discussion happens, each read as it stands, since a record needs ## no splitting where an mbox is a stream whose messages make(1) ## cannot name in advance. Which archives those are is $comments_json ## in the site's own config, written out above; a site that holds no ## such discussion names none and waits on nothing. $(sources.comments): src/comments.sentinel $(comments.map) $(sources.comments): $(comments.archives) ## A page renders the thread belonging to it, and the site names ## which .comments that is, page by page. Every page waiting on ## every page's thread --- which is what this was --- meant one ## article's .comments being rewritten rebuilt the whole site, ## since a page's .comments is rewritten whenever its .json is. $(root.dir)/style.css: mkdir -p $(@D) : > $@ $(root.dir)/$(img.dir)/favicon.svg: mkdir -p $(@D) printf '%s\n' \ '' \ '' \ ' ' \ '' > $@ ## The links are made in the tree they belong to, so the recipe ## goes there --- and the table it reads is named from here, not ## from there: how far down $(root.dir) sits is the site's to ## choose, and "../" only ever guessed at one answer. $(root.dir)/.gitignore: src/symlinks.txt mkdir -p $(@D) top=$$(pwd) && cd $(root.dir)/ && \ mkwb symlinks "$$top"/src/symlinks.txt > $(@F) ## An empty object stands in when the site ships no src/config.json, ## so the rule below always has its input and the build fails ## naming the setting it wants --- "Missing required $email" --- ## rather than the file. A site that writes one is left alone: ## this is a source file, not a derived asset. src/config.json: echo '{}' > $@ ## Everything the configuration needs that is not in config.json: ## the three one-line files beside the site, which mkwb reads ## itself, and the four values only make knows. LANGUAGES tells ## mkwb conf whether to path-derive a page's language (a site with ## $(root.dir)//...) or leave it empty (a flat one); empty is ## passed through as such. src/global.json: src/config.json baseurl.txt fingerprint.txt mkwb conf -G -n '$(NAME)' -l '$(LANGUAGES)' -u '$(PUBURL)' \ -t '$(translations.txt)' src/config.json > $@ ## $* is the target with its suffix off. POSIX promises it "at ## least for inference rules", and both GNU make and BSD make give ## it for an explicit rule too, as long as the suffix is one that ## .SUFFIXES declares --- and every suffix used below is. $(listings.html): cat $*.htmlheader $*.htmlbody $*.htmllisting $*.htmlfooter > $@ $(indexes.htmllisting): mkwb indexbody $*.json > $@ ## A language's front page: each collection the navigation lists, ## with the newest $(HOMECOUNT) of it. $(homes.htmllisting): mkwb homebody -c $(HOMECOUNT) $*.json > $@ $(categories.htmllisting): mkwb categoriesbody $*.json > $@ $(categories.txt): src/global.json mkwb categories src/global.json $(@D) > $@ $(categories.xml): src/global.json for f in $$(cat $*.txt); do \ c="$$(printf '%s\n' "$$f" | cut -d. -f2)"; \ mkwb feed src/global.json "$$f" \ $(@D)/feed."$$c".xml > $(@D)/feed."$$c".xml; \ printf '%s\n' $(@D)/feed."$$c".xml; \ done > $@ $(feeds.xml): src/global.json mkwb feed src/global.json $(@D)/sortdata.txt $@ > $@ ## An article's neighbours are its own rule, written by the ## site's deps.mk: it knows the collection's order and names the ## two pages either side of each entry, so a change to one entry ## reaches those two pages and no others. $(root.dir)/$(PUBURL): mkdir -p $(@D) : > $@ $(root.dir)/$(PUBURL).sentinel: src/global.json $(root.dir)/$(PUBURL) out=$$(echo $@ | sed 's/\.sentinel$$//'); \ gpg --export --armour "$$(mkwb get email src/global.json)" | \ ifne ifnew "$$out" touch $@ ## Rendered from the one SVG the site keeps, each straight to its ## own name. A sentinel and an ifnew(1) stood here to hold a ## file's mtime still when convert(1) wrote the same bytes again, ## and nothing downstream is built from a favicon --- it is ## installed and served, not read --- so the mtime bought nothing ## and the indirection cost a target make had no rule for. ## $< is an inference rule's, not an explicit rule's, under POSIX ## make, so each names its source. $(root.dir)/favicon.ico: $(root.dir)/$(img.dir)/favicon.svg convert $(root.dir)/$(img.dir)/favicon.svg -strip ico:- > $@ $(root.dir)/favicon.png: $(root.dir)/$(img.dir)/favicon.svg convert $(root.dir)/$(img.dir)/favicon.svg -strip png:- > $@ $(sources.media.torrent): src=$$(echo $@ | sed 's/\.torrent$$//'); \ rel=$$(echo "$$src" | cut -d/ -f3-); \ base=$$(basename "$$src"); \ mktorrent -x -f -d -n "$$base" -o $@ \ -w "https://$(NAME)$(BASEURL)$$rel" "$$src" ## Makes its own directory: what it waits on is every page's map ## entry, and a site with no pages yet waits on nothing, so nothing ## else has made the tree it writes into. $(root.dir)/sitemap.xml: $(sources.mapentry) mkdir -p $(@D) mkwb sitemap $(sources.mapentry) > $@ ## The site is served from its own name, so the canonical URL is ## derived rather than configured. $(BASEURL) is deliberately not ## folded in: it is the path prefix for in-site links, while this ## is the scheme-and-host every consumer concatenates a rooted path ## onto. baseurl.txt: echo 'https://$(NAME)' > $@ ## fingerprint.txt / expiry.txt tolerate a missing public key: if ## $(root.dir)/$(PUBURL) is empty (no key was exported), fall back ## to an empty fingerprint and a fixed far-future expiry (2099-12-31 ## UTC, epoch 4102444800). check-unit-expiry stays meaningful ## because expiry > now holds; security.txt stays valid (RFC 9116 ## requires an Expires line). fingerprint.txt: $(root.dir)/$(PUBURL) if [ -s $< ]; then \ gpg --always-trust --no-keyring --show-key --with-colons \ $< | \ awk -F: '/^pub:/ { print $$5 }' > $@; \ else \ : > $@; \ fi ## Rendered in UTC: date(1) writes the offset it is standing in ## otherwise, and then two builds of one site disagree about when ## the key expires because the people running them do not share a ## timezone. expiry.txt: $(root.dir)/$(PUBURL) if [ -s $< ]; then \ gpg --always-trust --no-keyring --show-key --with-colons \ $< | \ awk -F: '/^pub:/ { print $$7 }' | \ xargs -I% date -uIs -d@% > $@; \ else \ date -uIs -d '@4102444800' > $@; \ fi expiry-epoch.txt: expiry.txt date -d "$$(cat expiry.txt)" '+%s' > $@ now.txt: now > $@ $(root.dir)/.well-known/security.txt: src/global.json baseurl.txt \ expiry.txt $(root.dir)/$(PUBURL) mkdir -p $(@D) printf 'Contact: mailto:%s\n' \ "$$(mkwb get email src/global.json)" > $@ printf 'Expires: %s\n' "$$(cat expiry.txt)" >> $@ if [ -s $(root.dir)/$(PUBURL) ]; then \ printf 'Encryption: %s/$(PUBURL)\n' \ "$$(cat baseurl.txt)" >> $@; \ fi printf 'Preferred-Languages: en, pt, fr, eo, es, de\n' >> $@ ## Each writes out a variable deps.mk defines, so deps.mk is what ## they are made from: without it named here the list is written ## once and then never again, and a page added later is built, ## carried into no tarball, and shipped by nothing. src/sources.txt: deps.mk printf '%s\n' $(sources) > $@ src/all-contents.txt: deps.mk printf '%s\n' $(all-contents) > $@ src/all-filelists.txt: deps.mk src/all-symlinks.txt printf '%s\n' $(all-filelists) src/all-symlinks.txt > $@ src/all-symlinks.txt: $(root.dir)/.gitignore sed 's|^|$(root.dir)|' $(root.dir)/.gitignore > $@ src/install.txt: src/all-contents.txt src/all-filelists.txt $(all-filelists) cat src/all-contents.txt $$(cat src/all-filelists.txt) > $@ sources.txt: src/sources.txt install.txt: src/install.txt sources.txt install.txt: sed 's|^$(root.dir)/||' src/$(@F) > $@ ## What a site ships: the pages under one tarball and the sources ## they were built from under another, each carrying exactly what ## its list names. A tarball rather than a directory because it ## travels --- "cat install.tar | ssh host tar -xf - -C /srv/www" ## is the whole of a deployment --- and because installing is then ## the same extraction whether the tree is going next door or ## across a network. ## ## They are side assets, not derived ones: install.tar is built ## from what it archives, so it cannot be one of them. ## ## And it waits on all of that, static contents included. Naming ## only the derived ones held while the rest were sources the ## repository carried; a site that renders its favicon instead has ## nothing to make it, and dtar stops at the first name it cannot ## find. install.tar: $(derived-assets) $(contents) install.txt cat install.txt | dtar -C $(root.dir) > $@ ## Waits on the sources themselves, not merely on the list naming ## them: some are built --- a rendered favicon, a translated page --- ## and a parallel build that reached this rule first archived them ## empty, which the list alone could not have told it. sources.tar: sources.txt $(sources) cat sources.txt | dtar -C $(root.dir) > $@ ## ---- check-unit-* targets --------------------------------------- src/sort-expected.txt: if [ -n "$(articles.adoc)" ]; then \ dirname $(articles.adoc) | LC_ALL=C sort | \ uniq -c | \ awk '{ printf "%s\t%s\n", $$2, $$1 }'; \ fi > $@ src/sort-given.txt: $(sources.json) src/sort-expected.txt awk '{ \ "grep \"\\\"sort\\\":\" " $$1 "/*.json | wc -l" | \ getline cnt; \ printf "%s\t%s\n", $$1, cnt; \ }' src/sort-expected.txt > $@ check-unit-sorting: src/sort-expected.txt src/sort-given.txt diff -U10 src/sort-expected.txt src/sort-given.txt .SUFFIXES: .updatedat-check sources.updatedat-check = $(sources.adoc:.adoc=.updatedat-check) $(sources.updatedat-check): u=$$(mkwb get updatedat_epoch $*.json); \ d=$$(mkwb get date_epoch $*.json); \ if [ -n "$$u" ] && [ "$$u" -le "$$d" ]; then exit 3; fi check-unit-updatedat: $(sources.updatedat-check) .SUFFIXES: .links-internal-check sources.links-internal-check = $(sources.adoc:.adoc=.links-internal-check) $(sources.links-internal-check): $(sources.html) $(slides.pdf) dir=$$(dirname "$*"); \ grep -E '^(link|image):' $*.links | cut -d: -f2- | \ xargs -I% test -e "$$dir"/% check-unit-links-internal: $(sources.links-internal-check) check-unit-links-external: ## Every page carries a title. A source the transformer could not ## read one from -- a deck in another format, say -- renders one ## that is empty, and nothing downstream notices. .SUFFIXES: .title-check sources.title-check = $(sources.adoc:.adoc=.title-check) $(sources.title-check): $(sources.html) grep -q '[^<]' $*.html || { \ printf '%s: rendered with an empty title\n' "$*.html" >&2; \ exit 1; \ } check-unit-titles: $(sources.title-check) ## A deck that collapses to one page is what a source written in ## an input dialect the tool no longer speaks looks like: eslaides ## reads it, exits 0, and emits a deck with nothing broken out of ## it. The page count is the one thing that says so, and it is ## knowable from the source: one page per slide, and one slide ## more than there are breaks between them. ## ## The count alone does not catch the case that prompted this: a ## deck written in an input dialect the tool no longer speaks has ## no breaks it recognises, so one page is exactly what one slide ## predicts. Hence the second assertion --- a deck is never one ## slide, and a source that claims to be is being misread. ## ## awk rather than grep -c: a deck carrying an em dash or an emoji ## is enough for grep to call the PostScript binary and count ## nothing, which reads here as a deck that is fine. .SUFFIXES: .pages-check slides.pages-check = $(slides.eslaides:.eslaides=.pages-check) $(slides.pages-check): $(slides.ps) want=$$(awk '/^<<<$$/{n++} END{print n+1}' $*.eslaides); \ got=$$(awk '/^%%Page:/{n++} END{print n+0}' $*.ps); \ if [ "$$want" -ne "$$got" ]; then \ printf '%s: %s pages for %s slides\n' \ "$*.ps" "$$got" "$$want" >&2; \ exit 1; \ fi; \ if [ "$$want" -eq 1 ]; then \ printf '%s: no slide breaks; a deck is not one slide\n' \ "$*.eslaides" >&2; \ exit 1; \ fi check-unit-slides: $(slides.pages-check) ## A listing block that renders empty means the transformer lost ## the code it was handed, and usually the prose after it too. .SUFFIXES: .listing-check sources.listing-check = $(sources.adoc:.adoc=.listing-check) $(sources.listing-check): $(sources.html) if grep -q '<div class="content"></div>' $*.html; then \ printf '%s: a listing block rendered empty\n' \ "$*.html" >&2; \ exit 1; \ fi check-unit-listings: $(sources.listing-check) ## check-unit-links-internal sees only the link: and image: macros ## a page wrote. This sees what the templates emitted around it: ## the feed, the stylesheet, the icons, the navigation. .SUFFIXES: .links-html-check sources.links-html-check = $(sources.adoc:.adoc=.links-html-check) $(sources.links-html-check): $(sources.html) dir=$$(dirname "$*"); \ missing=$$(grep -oE '(href|src)="[^"#?:]+"' $*.html | \ sed -e 's/.*="//' -e 's/"$$//' | \ while read -r h; do \ case "$$h" in /*|'') continue;; esac; \ test -e "$$dir/$$h" || printf '%s ' "$$h"; \ done); \ if [ -n "$$missing" ]; then \ printf '%s: unresolved: %s\n' "$*.html" "$$missing" >&2; \ exit 1; \ fi check-unit-links-html: $(sources.links-html-check) ## Atom gives every feed a distinct id. A site that pins one feed ## URL for the whole build publishes several feeds claiming to be ## the same one. ## -exec ... + rather than $(find ...) as arguments: a site with ## no feeds at all fed grep(1) no filenames, which left it reading ## the terminal, and "make check" hung there rather than passing. check-unit-feed-ids: $(feeds.xml) $(categories.xml) dupes=$$(find $(root.dir) -name 'feed*.xml' -type f \ -exec grep -h 'rel="self"' {} + | \ sort | uniq -d); \ if [ -n "$$dupes" ]; then \ printf 'feeds sharing an id:\n%s\n' "$$dupes" >&2; \ exit 1; \ fi ## Only meaningful where content is partitioned by language: the ## directory a page sits in is what it should say it speaks. check-unit-lang: $(sources.html) if [ -z '$(LANGUAGES)' ]; then exit 0; fi; \ bad=''; \ for f in $(sources.html); do \ l=$$(printf '%s\n' "$${f#$(root.dir)/}" | cut -d/ -f1); \ case "$$l" in ??) ;; *) continue;; esac; \ d=$$(grep -m1 -o '<html lang="[^"]*"' "$$f" | \ sed -e 's/.*="//' -e 's/"//'); \ if [ "$$d" != "$$l" ]; then bad="$$bad $$f($$d)"; fi; \ done; \ if [ -n "$$bad" ]; then \ printf 'pages declaring a language their path does not:%s\n' \ "$$bad" >&2; \ exit 1; \ fi ## po4a writes a translation only when it has one, and a stale ## fuzzy flag is enough to skip a page without saying so. check-unit-i18n: if [ ! -f po/po4a.cfg ]; then exit 0; fi; \ missing=$$(grep -oE '[a-z][a-z]:$(root.dir)/[^[:space:]]+' \ po/po4a.cfg | \ cut -d: -f2 | \ while read -r t; do \ test -e "$$t" || printf '%s ' "$$t"; \ done); \ if [ -n "$$missing" ]; then \ printf 'declared in po4a.cfg, never generated: %s\n' \ "$$missing" >&2; \ exit 1; \ fi ## "clean" removes what the current deps.mk lists, so an artifact ## whose source was renamed or deleted stays behind for good -- ## and gitignored, so no status command shows it either. ## ## Three rules cover everything whose name says what produced it: ## nearly every artifact is <source>.<ext>, a code sidecar is ## <page>.html.<n>.txt, and a torrent or a sentinel is named for ## the file it describes. What is left out is derived from a ## directory rather than from one named file -- the dated sortdata ## markers, the feeds, the collection lists -- and so carries no ## name to check a source against. check-unit-orphans: $(derived-assets) orphans=$$(find $(root.dir) -type f | \ while read -r f; do \ case "$$f" in \ *.html.*.txt) \ [ -e "$${f%.html.*.txt}.adoc" ] || \ printf '%s ' "$$f";; \ *.torrent|*.sentinel) \ [ -e "$${f%.*}" ] || \ printf '%s ' "$$f";; \ *.htmlbody|*.json|*.snippets|*.links|\ *.caslinks|\ *.html|*.indexentry|*.feedentry|*.mapentry|\ *.categorydata|*.htmlheader|*.htmlfooter|\ *.prevnext|\ *.htmllisting|*.ps|*.pdf|*.midi) \ s=$${f%.*}; \ [ -e "$$s.adoc" ] || \ [ -e "$$s.eslaides" ] || \ [ -e "$$s.ly" ] || \ printf '%s ' "$$f";; \ esac; \ done); \ if [ -n "$$orphans" ]; then \ printf 'built artifacts whose source is gone: %s\n' \ "$$orphans" >&2; \ exit 1; \ fi symlink-deps = \ $(sources.html) \ $(feeds.xml) \ $(categories.xml) \ $(root.dir)/.well-known/security.txt \ $(sources.media.torrent) \ ## A symlink naming a FILE.gz is satisfied by FILE: the twin is ## the packager's to craft over the installed tree, not this ## build's -- see gzipdir(1). Every other link has to resolve ## here and now. check-unit-links-symlinks: src/all-symlinks.txt $(symlink-deps) dangling=''; \ for l in $$(cat src/all-symlinks.txt); do \ if [ -e "$$l" ]; then continue; fi; \ t=$$(readlink "$$l"); \ case "$$t" in \ *.gz) test -e "$$(dirname "$$l")/$${t%.gz}" && \ continue;; \ esac; \ dangling="$$dangling $$l"; \ done; \ if [ -n "$$dangling" ]; then \ printf 'symlinks resolving to nothing:%s\n' \ "$$dangling" >&2; \ exit 1; \ fi check-unit-links: check-unit-links-internal check-unit-links-external check-unit-links: check-unit-links-symlinks check-unit-links-html MAXSIZE = 52428800 # from spec: https://www.sitemaps.org/protocol.html check-unit-sitemap-size: $(root.dir)/sitemap.xml test "$$(stat --printf='%s' $(root.dir)/sitemap.xml)" -le $(MAXSIZE) check-unit-sitemap-count: $(root.dir)/sitemap.xml test "$$(grep -cF '</url>' $(root.dir)/sitemap.xml)" -le 50000 check-unit-sitemap: check-unit-sitemap-count check-unit-sitemap-size check-unit-expiry: expiry-epoch.txt now.txt test "$$(cat expiry-epoch.txt)" -gt "$$(cat now.txt)" check-unit: check-unit-sorting check-unit-updatedat check-unit-links check-unit: check-unit-sitemap check-unit-expiry check-unit: check-unit-titles check-unit-listings check-unit-feed-ids check-unit: check-unit-lang check-unit-i18n check-unit-orphans check-unit: check-unit-slides ## A site anchors "check" in its own Makefile so pristine(1) finds ## it there, and every site meant that to run these. One of them ## did not say so and its checks never ran, which is a silence no ## site should have to remember to break: the rules that define ## the checks are the rules that ask for them. A site with tests ## of its own names those on a "check" line beside this one. check: check-unit ALWAYS: $(sources.html) $(sources.json): src/i18n.stamp $(listings.htmllisting) $(categories.xml): src/i18n.stamp $(articles.feedentry): src/i18n.stamp