dots-of-war/xmonad/.xmonad/howto/howto.html

92 lines
45 KiB
HTML
Raw Permalink Normal View History

2020-06-21 10:41:26 +00:00
<!DOCTYPE html>
<!-- saved from url=(0055)https://sitr.us/2018/05/13/build-xmonad-with-stack.html -->
<html lang="en" data-react-helmet="lang"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="x-ua-compatible" content="ie=edge"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><style data-href="/styles.f628065b851287e306e5.css">@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:100;src:local("IBM Plex Sans Thin "),local("IBM Plex Sans-Thin"),url(/static/ibm-plex-sans-latin-100-245539db8ee56425757ef728eda8194e.woff2) format("woff2"),url(/static/ibm-plex-sans-latin-100-9a582f3a304f421eca4027517706843c.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:italic;font-display:swap;font-weight:100;src:local("IBM Plex Sans Thin italic"),local("IBM Plex Sans-Thinitalic"),url(/static/ibm-plex-sans-latin-100italic-3c34cf080b38f5fb1d4c59ffa45b3967.woff2) format("woff2"),url(/static/ibm-plex-sans-latin-100italic-1ea7c5d21b5956b602bdf9656cfb353f.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:200;src:local("IBM Plex Sans Extra Light "),local("IBM Plex Sans-Extra Light"),url(/static/ibm-plex-sans-latin-200-bf72c8412ab06c393f52efc5beb26ea7.woff2) format("woff2"),url(/static/ibm-plex-sans-latin-200-67524c36348a323f78f2845e3aafc2d4.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:italic;font-display:swap;font-weight:200;src:local("IBM Plex Sans Extra Light italic"),local("IBM Plex Sans-Extra Lightitalic"),url(/static/ibm-plex-sans-latin-200italic-bbc2d55223638ce450424a917e1104b2.woff2) format("woff2"),url(/static/ibm-plex-sans-latin-200italic-52df25607ec284ca361ae50ba24b3580.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:300;src:local("IBM Plex Sans Light "),local("IBM Plex Sans-Light"),url(/static/ibm-plex-sans-latin-300-9e1c48af24191f6ea8aede14957c5d01.woff2) format("woff2"),url(/static/ibm-plex-sans-latin-300-10bb6a0ae6dc8000d999ab622a45e281.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:italic;font-display:swap;font-weight:300;src:local("IBM Plex Sans Light italic"),local("IBM Plex Sans-Lightitalic"),url(/static/ibm-plex-sans-latin-300italic-c76f2ab53673e964b6e6734c1c455761.woff2) format("woff2"),url(/static/ibm-plex-sans-latin-300italic-d3566d5bb4f31d86bfb9fda09563b416.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:local("IBM Plex Sans Regular "),local("IBM Plex Sans-Regular"),url(/static/ibm-plex-sans-latin-400-263d6267533501f58c33b12b382e3abb.woff2) format("woff2"),url(/static/ibm-plex-sans-latin-400-a2c56f946488a9a267ba6ba21471a217.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:italic;font-display:swap;font-weight:400;src:local("IBM Plex Sans Regular italic"),local("IBM Plex Sans-Regularitalic"),url(/static/ibm-plex-sans-latin-400italic-89a93a1bdde48c7bb104150de88affce.woff2) format("woff2"),url(/static/ibm-plex-sans-latin-400italic-272f86114c980c52c131dfc3b4ae3276.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:local("IBM Plex Sans Medium "),local("IBM Plex Sans-Medium"),url(/static/ibm-plex-sans-latin-500-0866c24487514ad726738fb24f8e015b.woff2) format("woff2"),url(/static/ibm-plex-sans-latin-500-f6d5c5d5b849796d6a8f5a2953b60753.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:italic;font-display:swap;font-weight:500;src:local("IBM Plex Sans Medium italic"),local("IBM Plex Sans-Mediumitalic"),url(/static/ibm-plex-sans-latin-500italic-ffd12d59339823b8cf53b9f99b47d87c.woff2) format("woff2"),url(/static/ibm-plex-sans-latin-500italic-ccd41bd1a5bfa8bad2cd8d35fdaeb3d1.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:local("IBM Plex Sans SemiBold "),local("IBM Plex Sans-SemiBold"),url(/static/ibm-plex-sans-latin-600-7852d4dc26ef44df58e23dc0b9722d6f.woff2) format("woff2"),url(/static/ibm-plex-sans-latin-600-337b16517a23
That means that when you want to apply a new configuration you actually build
xmonad…"><meta data-react-helmet="true" name="image" content="https://sitr.us/banner.jpg"><meta data-react-helmet="true" property="og:title" content="I finally set up XMonad to build with Stack!"><meta data-react-helmet="true" property="og:url" content="https://sitr.us"><meta data-react-helmet="true" property="og:description" content="The XMonad window manager is configured in Haskell.
That means that when you want to apply a new configuration you actually build
xmonad…"><meta data-react-helmet="true" property="og:image" content="https://sitr.us/banner.jpg"><meta data-react-helmet="true" property="og:type" content="website"><meta data-react-helmet="true" property="og:image:alt" content="The XMonad window manager is configured in Haskell.
That means that when you want to apply a new configuration you actually build
xmonad…"><meta data-react-helmet="true" name="twitter:card" content="summary_large_image"><meta data-react-helmet="true" name="twitter:title" content="I finally set up XMonad to build with Stack!"><meta data-react-helmet="true" name="twitter:url" content="https://sitr.us"><meta data-react-helmet="true" name="twitter:description" content="The XMonad window manager is configured in Haskell.
That means that when you want to apply a new configuration you actually build
xmonad…"><meta data-react-helmet="true" name="twitter:image" content="https://sitr.us/banner.jpg"><meta data-react-helmet="true" name="twitter:image:alt" content="The XMonad window manager is configured in Haskell.
That means that when you want to apply a new configuration you actually build
xmonad…"><meta data-react-helmet="true" name="twitter:creator" content="@hallettj"><meta data-react-helmet="true" name="gatsby-theme" content="@lekoarts/gatsby-theme-minimal-blog"><link rel="preconnect dns-prefetch" href="https://www.google-analytics.com/"><link rel="sitemap" type="application/xml" href="https://sitr.us/sitemap.xml"><link rel="icon" href="https://sitr.us/icons/icon-48x48.png?v=caf57ab8a19cf2e6a923cd405e7b66a9"><link rel="manifest" href="https://sitr.us/manifest.webmanifest"><meta name="theme-color" content="#cb9d06"><link rel="apple-touch-icon" sizes="48x48" href="https://sitr.us/icons/icon-48x48.png?v=caf57ab8a19cf2e6a923cd405e7b66a9"><link rel="apple-touch-icon" sizes="72x72" href="https://sitr.us/icons/icon-72x72.png?v=caf57ab8a19cf2e6a923cd405e7b66a9"><link rel="apple-touch-icon" sizes="96x96" href="https://sitr.us/icons/icon-96x96.png?v=caf57ab8a19cf2e6a923cd405e7b66a9"><link rel="apple-touch-icon" sizes="144x144" href="https://sitr.us/icons/icon-144x144.png?v=caf57ab8a19cf2e6a923cd405e7b66a9"><link rel="apple-touch-icon" sizes="192x192" href="https://sitr.us/icons/icon-192x192.png?v=caf57ab8a19cf2e6a923cd405e7b66a9"><link rel="apple-touch-icon" sizes="256x256" href="https://sitr.us/icons/icon-256x256.png?v=caf57ab8a19cf2e6a923cd405e7b66a9"><link rel="apple-touch-icon" sizes="384x384" href="https://sitr.us/icons/icon-384x384.png?v=caf57ab8a19cf2e6a923cd405e7b66a9"><link rel="apple-touch-icon" sizes="512x512" href="https://sitr.us/icons/icon-512x512.png?v=caf57ab8a19cf2e6a923cd405e7b66a9"><link as="script" rel="preload" href="./I finally set up XMonad to build with Stack! _ sitr.us_files/styles-2c3ea41ae3281f2424df.js"><link as="script" rel="preload" href="./I finally set up XMonad to build with Stack! _ sitr.us_files/component---src-lekoarts-gatsby-theme-minimal-blog-core-templates-post-query-tsx-bb65031b5086bc35ab24.js"><link as="script" rel="preload" href="./I finally set up XMonad to build with Stack! _ sitr.us_files/commons-8d1316e99596af343d32.js"><link as="script" rel="preload" href="./I finally set up XMonad to build with Stack! _ sitr.us_files/app-1d89443379b1055b2f94.js"><link as="script" rel="preload" href="./I finally set up XMonad to build with Stack! _ sitr.us_files/webpack-runtime-889e88d4b2c87811c013.js"><link as="fetch" rel="preload" href="https://sitr.us/page-data/2018/05/13/build-xmonad-with-stack.html/page-data.json" crossorigin="anonymous"><style data-emotion="css-global"></style><style data-emotion-css="wuy82p">.css-wuy82p{font-family:"IBM Plex Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.625;font-weight:400;color:var(--theme-ui-colors-text,#2d3748);background-color:var(--theme-ui-colors-background,#fff);}</style><style data-emotion="css-global"></style><style data-emotion-css="1g597hz">.css-1g597hz{border:0;-webkit-clip:react(0 0 0 0);clip:react(0 0 0 0);height:1px;width:1px;margin:-1px;padding:0;overflow:hidden;position:absolute;}.css-1g597hz:focus{padding:1rem;position:fixed;top:15px;left:15px;background-color:var(--theme-ui-colors-heading,#000);color:var(--theme-ui-colors-background,#fff);z-index:1;width:auto;height:auto;-webkit-clip:auto;clip:auto;-webkit-text-decoration:none;text-decoration:none;}</style><style data-emotion-css="feqrbk">.css-feqrbk{width:100%;min-width:0;max-width:1024px;margin-left:auto;margin-right:auto;padding:1rem;}@media screen and (min-width:640px){.css-feqrbk{padding:2rem;}}</style><style data-emotion-css="185ihix">.css-185ihix{box-sizing:border-box;min-width:0;width:100%;min-width:0;max-width:1024px;margin-left:auto;margin-right:auto;padding:1rem;}@media screen and (min-width:640px){.css-185ihix{padding:2rem;}}</style><style data-emotion-css="1wt4r56">.css-1wt4r56{margin-bottom:4rem;}@media screen and (min-width:640px){.css-1wt4r56{margin-bottom:8rem;}}</style><style data-emotion-css="1eswzqe">.css-1eswzqe{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-web
var mode = localStorage.getItem('theme-ui-color-mode');
if (!mode) return
document.body.classList.add('theme-ui-' + mode);
} catch (e) {} })();</script><div id="___gatsby"><div style="outline:none" tabindex="-1" role="group" id="gatsby-focus-wrapper"><div data-testid="theme-root" class="css-wuy82p"><a href="https://sitr.us/2018/05/13/build-xmonad-with-stack.html#skip-nav" data-skip-link="true" class="css-1g597hz">Skip to content</a><div class="css-185ihix"><header class="css-1wt4r56"><div class="css-190uhut"><a aria-label="sitr.us - Back to home" class="css-dz3ojy" href="https://sitr.us/"><h1 class="css-1kmktz0">sitr.us</h1></a><button type="button" aria-label="Activate Dark Mode" title="Activate Dark Mode" class="css-af3ja4"><div class="css-iiu7h7"></div></button></div><div class="css-1kvspmd"><nav class="css-nrb238"><a class="css-1od09yo" href="https://sitr.us/blog">Blog</a><a class="css-1od09yo" href="https://sitr.us/about">About</a></nav><div class="css-e5k4e3"><a href="https://github.com/hallettj/" class="css-1od09yo">Github</a><a href="https://twitter.com/hallettj/" class="css-1od09yo">Twitter</a><a href="mailto:jesse@sitr.us" class="css-1od09yo">Email</a></div></div></header><main id="skip-nav" class="css-1489aiv"><h2 class="css-1bzbprl">I finally set up XMonad to build with Stack!</h2><p class="css-1fkzbc2"><time datetime="2018-05-13">2018-05-13</time><a class="css-1od09yo" href="https://sitr.us/tags/x-monad">XMonad</a><span>3<!-- --> min read</span></p><section class="css-f0b8g7"><p class="css-1bkk5q4">The <a href="http://xmonad.org/" class="css-1od09yo">XMonad</a> window manager is configured in Haskell.
That means that when you want to apply a new configuration you actually build
xmonad itself incorporating code from your configuration file.
It sounds more painful than it is -
when you install xmonad you get an executable called <code class="css-0">xmonad</code> that handles the
details of bootstrapping your custom build.
The command <code class="css-0">xmonad --recompile</code> builds <code class="css-0">~/.xmonad/xmonad.hs</code>,
and subsequent invocations of <code class="css-0">xmonad</code> run the executable that is produced.</p><p class="css-1bkk5q4">When you configure xmonad you are actually writing your own version of the
program.
Because you can write arbitrary code the possibilities for customization are
endless!
As with any software project,
you get maximum expressive power when you bring in third-party libraries.
<code class="css-0">xmonad-contrib</code> is a popular choice -
but you can import any Haskell library that you want.
With libraries come the problem of managing library packages.
In the past I used the <code class="css-0">cabal</code> command to globally install library packages.
From time to time I would clear out my installed packages,
or change something while working on another Haskell project,
and then my window manager would stop working.
I wanted a better option.</p><p class="css-1bkk5q4"><a href="https://docs.haskellstack.org/en/stable/README/" class="css-1od09yo">Stack</a> is my preferred dependency management and build tool for Haskell
projects.
Stack automatically fetches project dependencies,
and maintains isolated sets of installed packages for each project.
With stack I declare dependencies in a <a href="https://github.com/hallettj/dot-xmonad/blob/master/home/.xmonad/my-xmonad.cabal" class="css-1od09yo">.cabal file</a>,
and stack ensures that I have up-to-date copies of all libraries whenever
xmonad builds itself.</p><p class="css-1bkk5q4">To use stack I needed to hook into xmonad's build process.
I used this <a href="http://brianbuccola.com/how-to-install-xmonad-and-xmobar-via-stack/" class="css-1od09yo">blog post</a> as a starting point.
That post provides instructions for using the <code class="css-0">stack ghc</code> command to invoke ghc
in an environment prepared by stack.
But I have some custom code modules in <code class="css-0">~/.xmonad/lib/</code>,
and I had problems getting ghc to find those when running <code class="css-0">stack ghc</code>.
So I opted to set up a fully-fledged stack project which is built with the
usual <code class="css-0">stack build</code> command.
You can take a look at my <a href="https://github.com/hallettj/dot-xmonad/tree/master/home/.xmonad" class="css-1od09yo">~/.xmonad/</a> directory to get the high-level view.</p><p class="css-1bkk5q4">The key is the <a href="https://github.com/hallettj/dot-xmonad/blob/master/home/.xmonad/build" class="css-1od09yo">build</a> script.
Starting in xmonad v0.13 if there is an executable called <code class="css-0">build</code> in your
<code class="css-0">~/.xmonad/</code> directory then xmonad will defer to that script.
<code class="css-0">build</code> gets a path as an argument which is where the compiled xmonad executable
should be placed.
My script looks like this:</p><div class="gatsby-highlight" data-language="sh"><pre class="prism-code language-sh" data-linenumber="false" style="color: rgb(214, 222, 235); background-color: rgb(1, 22, 39);"><div class="token-line" style="color: rgb(214, 222, 235);"><span class="token plain">#!/bin/sh</span></div><div class="token-line" style="color: rgb(214, 222, 235);"><span class="token plain" style="display: inline-block;"></span></div><div class="token-line" style="color: rgb(214, 222, 235);"><span class="token plain">set -e</span></div><div class="token-line" style="color: rgb(214, 222, 235);"><span class="token plain" style="display: inline-block;"></span></div><div class="token-line" style="color: rgb(214, 222, 235);"><span class="token plain">stack build :my-xmonad --verbosity error</span></div><div class="token-line" style="color: rgb(214, 222, 235);"><span class="token plain">stack install :my-xmonad --local-bin-path bin/ --verbosity error</span></div><div class="token-line" style="color: rgb(214, 222, 235);"><span class="token plain">mv bin/my-xmonad "$1"</span></div></pre></div><p class="css-1bkk5q4">My <code class="css-0">my-xmonad.cabal</code> file declares an executable named <code class="css-0">my-xmonad</code>
(which is actually my customized version of xmonad).
This script builds that executable,
installs the it to <code class="css-0">~/.xmonad/bin/my-xmonad</code>
(thanks to the <code class="css-0">--local-bin-path</code> argument to <code class="css-0">stack install</code>),
and finally moves the executable to the location given by the first argument to
the <code class="css-0">build</code> script.</p><p class="css-1bkk5q4">You can detailed on working with stack from stack's <a href="https://docs.haskellstack.org/en/stable/GUIDE/" class="css-1od09yo">user guide</a>.
If you want to get going quickly I created a stack <a href="https://raw.githubusercontent.com/hallettj/dot-xmonad/master/home/.xmonad/xmonad.hsfiles" class="css-1od09yo">project template</a> to set
up xmonad with stack.
Here is what you do:</p><ul class="css-15rlv7r"><li class="css-0">Install xmonad and stack using your preferred package manager - you need xmonad v0.13 or later.</li><li class="css-0">Run <code class="css-0">stack new my-xmonad https://raw.githubusercontent.com/hallettj/dot-xmonad/master/home/.xmonad/xmonad.hsfiles</code></li><li class="css-0">If you are setting up a new xmonad configuration then <code class="css-0">mv my-xmonad ~/.xmonad</code>. Otherwise copy files from <code class="css-0">my-xmonad/</code> to <code class="css-0">~/.xmonad/</code> and then delete <code class="css-0">my-xmonad/</code>. The relevant files are:<ul class="css-15rlv7r"><li class="css-0"><code class="css-0">my-xmonad.cabal</code>, your project manifest</li><li class="css-0"><code class="css-0">build</code></li><li class="css-0"><code class="css-0">lib/</code> - this directory must exist or the project will not build!</li><li class="css-0"><code class="css-0">xmonad.hs</code>, in case you do not have your own</li><li class="css-0"><code class="css-0">.gitignore</code>, in case you want to version-control your xmonad config</li></ul></li><li class="css-0"><code class="css-0">chmod a+x ~/.xmonad/build</code> - if the build script is not marked as executable xmonad will not execute it.</li><li class="css-0">In <code class="css-0">~/.xmonad/</code> run <code class="css-0">stack setup</code> to install the version of ghc that stack wants to use. (Stack installs ghc in a sandbox so that it does not conflict with any other ghc installation on your machine.)</li></ul><p class="css-1bkk5q4">Names of any custom modules that you have in <code class="css-0">~/.xmonad/lib</code> need to be listed in the <code class="css-0">other-modules</code> section in <code class="css-0">~/.xmonad/my-xmonad.cabal</code>.
If you want to add library dependencies beyond <code class="css-0">xmonad</code> and <code class="css-0">xmonad-contrib</code>
then add them to the <code class="css-0">build-depends</code> section in the same file.
Stack pulls dependencies from <a href="https://www.stackage.org/" class="css-1od09yo">Stackage</a>,
which hosts curated sets of packages.
The <code class="css-0">resolver</code> setting in <code class="css-0">stack.yaml</code> determines the version of each
dependency that you get,
and the version of ghc that stack will use to compile xmonad.
If you want to use libraries that are not hosted on Stackage you will need to
list package names with exact version numbers in the <code class="css-0">extra-deps</code> section in
<code class="css-0">stack.yaml</code> according to <a href="https://docs.haskellstack.org/en/stable/GUIDE/#extra-deps" class="css-1od09yo">these instructions</a>.</p><p class="css-1bkk5q4">Test everything by running <code class="css-0">xmonad --recompile</code> from any directory.
If that works then you are all set!</p><footer></footer></section></main><footer class="css-6x8z6y"><div><p>Copyright © 2007<!-- -->2020<!-- --> by Jesse Hallett.</p><p>This work is licensed under a<!-- --> <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/" class="css-1od09yo">Creative Commons Attribution-ShareAlike 4.0 International License.<!-- --> <img alt="Creative Commons License" src="./I finally set up XMonad to build with Stack! _ sitr.us_files/80x15.png" class="css-1fk4m44"></a></p></div><div><a aria-label="Link to the theme&#39;s GitHub repository" href="https://github.com/LekoArts/gatsby-themes/tree/master/themes/gatsby-theme-minimal-blog" class="css-1od09yo">Theme</a> <!-- -->by<!-- --> <a aria-label="Link to the theme author&#39;s website" href="https://www.lekoarts.de/en" class="css-1od09yo">LekoArts</a></div></footer></div></div></div><div id="gatsby-announcer" role="alert" aria-live="assertive" aria-atomic="true" style="position: absolute; width: 1px; height: 1px; padding: 0px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); white-space: nowrap; border: 0px;"></div></div><script>
if(true) {
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
}
if (typeof ga === "function") {
ga('create', 'UA-327628-1', 'auto', {});
}</script><script id="gatsby-script-loader">/*<![CDATA[*/window.pagePath="/2018/05/13/build-xmonad-with-stack.html";/*]]>*/</script><script id="gatsby-chunk-mapping">/*<![CDATA[*/window.___chunkMapping={"app":["/app-1d89443379b1055b2f94.js"],"component---src-lekoarts-gatsby-theme-minimal-blog-core-templates-homepage-query-tsx":["/component---src-lekoarts-gatsby-theme-minimal-blog-core-templates-homepage-query-tsx-699cefe8b04da8b3eff9.js"],"component---src-lekoarts-gatsby-theme-minimal-blog-core-templates-blog-query-tsx":["/component---src-lekoarts-gatsby-theme-minimal-blog-core-templates-blog-query-tsx-cff89e6980695b74d021.js"],"component---node-modules-lekoarts-gatsby-theme-minimal-blog-core-src-templates-tags-query-tsx":["/component---node-modules-lekoarts-gatsby-theme-minimal-blog-core-src-templates-tags-query-tsx-561fe71fa12db25c2485.js"],"component---src-lekoarts-gatsby-theme-minimal-blog-core-templates-post-query-tsx":["/component---src-lekoarts-gatsby-theme-minimal-blog-core-templates-post-query-tsx-bb65031b5086bc35ab24.js"],"component---node-modules-lekoarts-gatsby-theme-minimal-blog-core-src-templates-page-query-tsx":["/component---node-modules-lekoarts-gatsby-theme-minimal-blog-core-src-templates-page-query-tsx-b48df875d40e887efb07.js"],"component---node-modules-lekoarts-gatsby-theme-minimal-blog-core-src-templates-tag-query-tsx":["/component---node-modules-lekoarts-gatsby-theme-minimal-blog-core-src-templates-tag-query-tsx-551b07f8097e353b4de7.js"],"component---node-modules-gatsby-plugin-offline-app-shell-js":["/component---node-modules-gatsby-plugin-offline-app-shell-js-cf2fd0f92da7499f18b1.js"]};/*]]>*/</script><script src="./I finally set up XMonad to build with Stack! _ sitr.us_files/webpack-runtime-889e88d4b2c87811c013.js" async=""></script><script src="./I finally set up XMonad to build with Stack! _ sitr.us_files/app-1d89443379b1055b2f94.js" async=""></script><script src="./I finally set up XMonad to build with Stack! _ sitr.us_files/commons-8d1316e99596af343d32.js" async=""></script><script src="./I finally set up XMonad to build with Stack! _ sitr.us_files/component---src-lekoarts-gatsby-theme-minimal-blog-core-templates-post-query-tsx-bb65031b5086bc35ab24.js" async=""></script><script src="./I finally set up XMonad to build with Stack! _ sitr.us_files/styles-2c3ea41ae3281f2424df.js" async=""></script></body></html>