Rebased on hakyll-skeleton

This commit is contained in:
Raging Raspberries 2021-11-18 20:08:04 +10:00
parent 321ac6c77d
commit 9e2c51f9fb
Signed by: ragingraspberries
GPG key ID: 34A4AA0A1C186AA2
21 changed files with 791 additions and 312 deletions

538
css/resrok.css Normal file
View file

@ -0,0 +1,538 @@
/*
* JFDIC theme
*/
/*
* Global resets
*
* Update the foundational and global aspects of the page.
*/
/* Prevent scroll on narrow devices */
html,
body {
overflow-x: hidden;
}
html {
font-family: "PT Serif", Georgia, "Times New Roman", serif;
}
h1, h2, h3, h4, h5, h6 {
font-family: "PT Sans", Helvetica, Arial, sans-serif;
font-weight: 400;
color: #313131;
letter-spacing: -.025rem;
}
/*
* Wrapper
*
* The wrapper is used to position site content when the sidebar is toggled. We
* use an outter wrap to position the sidebar without interferring with the
* regular page content.
*/
.wrap {
position: relative;
width: 100%;
}
/*
* Container
*
* Center the page content.
*/
.container {
max-width: 28rem;
}
@media (min-width: 38em) {
.container {
max-width: 32rem;
}
}
@media (min-width: 56em) {
.container {
max-width: 38rem;
}
}
/*
* Masthead
*
* Super small header above the content for site name and short description.
*/
.masthead {
padding-top: 1rem;
padding-bottom: 1rem;
margin-bottom: 3rem;
border-bottom: 1px solid #eee;
}
.masthead-title {
margin-top: 0;
margin-bottom: 0;
color: #505050;
}
.masthead-title a {
color: #505050;
}
.masthead-title img {
max-width: 10%;
margin-top: 0;
margin-bottom: 0;
vertical-align: middle;
}
.masthead-title small {
font-size: 75%;
font-weight: 400;
color: #c0c0c0;
letter-spacing: 0;
}
@media (max-width: 48em) {
.masthead-title {
text-align: center;
}
.masthead-title small {
display: none;
}
}
/*
* Sidebar
*
* The sidebar is the drawer, the item we are toggling with our handy hamburger
* button in the corner of the page.
*
* This particular sidebar implementation was inspired by Chris Coyier's
* "Offcanvas Menu with CSS Target" article, and the checkbox variation from the
* comments by a reader. It modifies both implementations to continue using the
* checkbox (no change in URL means no polluted browser history), but this uses
* `position` for the menu to avoid some potential content reflow issues.
*
* Source: http://css-tricks.com/off-canvas-menu-with-css-target/#comment-207504
*/
/* Style and "hide" the sidebar */
.sidebar {
position: fixed;
top: 0;
bottom: 0;
left: -14rem;
width: 14rem;
visibility: hidden;
overflow-y: auto;
font-family: "PT Sans", Helvetica, Arial, sans-serif;
font-size: .875rem; /* 15px */
color: rgba(255,255,255,.6);
background-color: #202020;
-webkit-transition: all .3s ease-in-out;
transition: all .3s ease-in-out;
}
@media (min-width: 30em) {
.sidebar {
font-size: .75rem; /* 14px */
}
}
/* Sidebar content */
.sidebar a {
font-weight: normal;
color: #fff;
}
.sidebar-item {
padding: 1rem;
}
.sidebar-item p:last-child {
margin-bottom: 0;
}
/* Sidebar nav */
.sidebar-nav {
border-bottom: 1px solid rgba(255,255,255,.1);
}
.sidebar-nav-item {
display: block;
padding: .5rem 1rem;
border-top: 1px solid rgba(255,255,255,.1);
}
.sidebar-nav-item.active,
a.sidebar-nav-item:hover,
a.sidebar-nav-item:focus {
text-decoration: none;
background-color: rgba(255,255,255,.1);
border-color: transparent;
}
@media (min-width: 48em) {
.sidebar-item {
padding: 1.5rem;
}
.sidebar-nav-item {
padding-left: 1.5rem;
padding-right: 1.5rem;
}
}
/* Hide the sidebar checkbox that we toggle with `.sidebar-toggle` */
.sidebar-checkbox {
position: absolute;
opacity: 0;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
/* Style the `label` that we use to target the `.sidebar-checkbox` */
.sidebar-toggle {
position: absolute;
top: .8rem;
left: 1rem;
display: flex;
align-items: center;
padding: .25rem .75rem;
color: #505050;
background-color: #fff;
border-radius: .25rem;
cursor: pointer;
}
.sidebar-toggle::before {
display: inline-block;
width: 32px;
height: 32px;
content: "";
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' fill='%23555' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M2.5 11.5A.5.5 0 013 11h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5zm0-4A.5.5 0 013 7h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5zm0-4A.5.5 0 013 3h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5z' clip-rule='evenodd'/%3E%3C/svg%3E") no-repeat;
}
.sidebar-toggle:active,
#sidebar-checkbox:focus ~ .sidebar-toggle,
#sidebar-checkbox:checked ~ .sidebar-toggle {
color: #fff;
background-color: #555;
}
.sidebar-toggle:active:before,
#sidebar-checkbox:focus ~ .sidebar-toggle::before,
#sidebar-checkbox:checked ~ .sidebar-toggle::before {
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M2.5 11.5A.5.5 0 013 11h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5zm0-4A.5.5 0 013 7h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5zm0-4A.5.5 0 013 3h10a.5.5 0 010 1H3a.5.5 0 01-.5-.5z' clip-rule='evenodd'/%3E%3C/svg%3E") no-repeat;
}
@media (min-width: 30.1em) {
.sidebar-toggle {
position: fixed;
}
}
@media print {
.sidebar-toggle {
display: none;
}
}
/* Slide effect
*
* Handle the sliding effects of the sidebar and content in one spot, seperate
* from the default styles.
*
* As an a heads up, we don't use `transform: translate3d()` here because when
* mixed with `position: fixed;` for the sidebar toggle, it creates a new
* containing block. Put simply, the fixed sidebar toggle behaves like
* `position: absolute;` when transformed.
*
* Read more about it at http://meyerweb.com/eric/thoughts/2011/09/12/.
*/
.wrap,
.sidebar,
.sidebar-toggle {
-webkit-backface-visibility: hidden;
-ms-backface-visibility: hidden;
backface-visibility: hidden;
}
.wrap,
.sidebar-toggle {
-webkit-transition: -webkit-transform .3s ease-in-out;
transition: transform .3s ease-in-out;
}
#sidebar-checkbox:checked + .sidebar {
z-index: 10;
visibility: visible;
}
#sidebar-checkbox:checked ~ .sidebar,
#sidebar-checkbox:checked ~ .wrap,
#sidebar-checkbox:checked ~ .sidebar-toggle {
-webkit-transform: translateX(14rem);
-ms-transform: translateX(14rem);
transform: translateX(14rem);
}
/*
* Posts and pages
*
* Each post is wrapped in `.post` and is used on default and post layouts. Each
* page is wrapped in `.page` and is only used on the page layout.
*/
.page,
.post {
margin-bottom: 4em;
}
/* Blog post or page title */
.page-title,
.post-title,
.post-title a {
color: #303030;
}
.page-title,
.post-title {
margin-top: 0;
}
/* Meta data line below post title */
.post-date {
display: block;
margin-top: -.5rem;
margin-bottom: 1rem;
color: #9a9a9a;
}
/* Related posts */
.related {
padding-top: 2rem;
padding-bottom: 2rem;
border-top: 1px solid #eee;
}
.related-posts {
padding-left: 0;
list-style: none;
}
.related-posts h3 {
margin-top: 0;
}
.related-posts li small {
font-size: 75%;
color: #999;
}
.related-posts li a:hover {
color: #268bd2;
text-decoration: none;
}
.related-posts li a:hover small {
color: inherit;
}
/*
* Pagination
*
* Super lightweight (HTML-wise) blog pagination. `span`s are provide for when
* there are no more previous or next posts to show.
*/
.pagination {
overflow: hidden; /* clearfix */
margin-left: -1rem;
margin-right: -1rem;
font-family: "PT Sans", Helvetica, Arial, sans-serif;
color: #ccc;
text-align: center;
}
/* Pagination items can be `span`s or `a`s */
.pagination-item {
display: block;
padding: 1rem;
border: 1px solid #eee;
}
.pagination-item:first-child {
margin-bottom: -1px;
}
/* Only provide a hover state for linked pagination items */
a.pagination-item:hover {
background-color: #f5f5f5;
}
@media (min-width: 30em) {
.pagination {
margin: 3rem 0;
}
.pagination-item {
float: left;
width: 50%;
}
.pagination-item:first-child {
margin-bottom: 0;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
}
.pagination-item:last-child {
margin-left: -1px;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
}
}
/*
* Reverse layout
*
* Flip the orientation of the page by placing the `.sidebar` and sidebar toggle
* on the right side.
*/
.layout-reverse .sidebar {
left: auto;
right: -14rem;
}
.layout-reverse .sidebar-toggle {
left: auto;
right: 1rem;
}
.layout-reverse #sidebar-checkbox:checked ~ .sidebar,
.layout-reverse #sidebar-checkbox:checked ~ .wrap,
.layout-reverse #sidebar-checkbox:checked ~ .sidebar-toggle {
-webkit-transform: translateX(-14rem);
-ms-transform: translateX(-14rem);
transform: translateX(-14rem);
}
/*
* Themes
*
* Apply custom color schemes by adding the appropriate class to the `body`.
* Based on colors from Base16: http://chriskempson.github.io/base16/#default.
*/
/* Red */
.theme-base-08 .sidebar,
.theme-base-08 .sidebar-toggle:active,
.theme-base-08 #sidebar-checkbox:checked ~ .sidebar-toggle {
background-color: #ac4142;
}
.theme-base-08 .container a,
.theme-base-08 .sidebar-toggle,
.theme-base-08 .related-posts li a:hover {
color: #ac4142;
}
/* Orange */
.theme-base-09 .sidebar,
.theme-base-09 .sidebar-toggle:active,
.theme-base-09 #sidebar-checkbox:checked ~ .sidebar-toggle {
background-color: #d28445;
}
.theme-base-09 .container a,
.theme-base-09 .sidebar-toggle,
.theme-base-09 .related-posts li a:hover {
color: #d28445;
}
/* Yellow */
.theme-base-0a .sidebar,
.theme-base-0a .sidebar-toggle:active,
.theme-base-0a #sidebar-checkbox:checked ~ .sidebar-toggle {
background-color: #f4bf75;
}
.theme-base-0a .container a,
.theme-base-0a .sidebar-toggle,
.theme-base-0a .related-posts li a:hover {
color: #f4bf75;
}
/* Green */
.theme-base-0b .sidebar,
.theme-base-0b .sidebar-toggle:active,
.theme-base-0b #sidebar-checkbox:checked ~ .sidebar-toggle {
background-color: #90a959;
}
.theme-base-0b .container a,
.theme-base-0b .sidebar-toggle,
.theme-base-0b .related-posts li a:hover {
color: #90a959;
}
/* Cyan */
.theme-base-0c .sidebar,
.theme-base-0c .sidebar-toggle:active,
.theme-base-0c #sidebar-checkbox:checked ~ .sidebar-toggle {
background-color: #75b5aa;
}
.theme-base-0c .container a,
.theme-base-0c .sidebar-toggle,
.theme-base-0c .related-posts li a:hover {
color: #75b5aa;
}
/* Blue */
.theme-base-0d .sidebar,
.theme-base-0d .sidebar-toggle:active,
.theme-base-0d #sidebar-checkbox:checked ~ .sidebar-toggle {
background-color: #6a9fb5;
}
.theme-base-0d .container a,
.theme-base-0d .sidebar-toggle,
.theme-base-0d .related-posts li a:hover {
color: #6a9fb5;
}
/* Magenta */
.theme-base-0e .sidebar,
.theme-base-0e .sidebar-toggle:active,
.theme-base-0e #sidebar-checkbox:checked ~ .sidebar-toggle {
background-color: #aa759f;
}
.theme-base-0e .container a,
.theme-base-0e .sidebar-toggle,
.theme-base-0e .related-posts li a:hover {
color: #aa759f;
}
/* Brown */
.theme-base-0f .sidebar,
.theme-base-0f .sidebar-toggle:active,
.theme-base-0f #sidebar-checkbox:checked ~ .sidebar-toggle {
background-color: #8f5536;
}
.theme-base-0f .container a,
.theme-base-0f .sidebar-toggle,
.theme-base-0f .related-posts li a:hover {
color: #8f5536;
}
/*
* Overlay sidebar
*
* Make the sidebar content overlay the viewport content instead of pushing it
* aside when toggled.
*/
.sidebar-overlay #sidebar-checkbox:checked ~ .wrap {
-webkit-transform: translateX(0);
-ms-transform: translateX(0);
transform: translateX(0);
}
.sidebar-overlay #sidebar-checkbox:checked ~ .sidebar-toggle {
box-shadow: 0 0 0 .25rem #fff;
}
.sidebar-overlay #sidebar-checkbox:checked ~ .sidebar {
box-shadow: .25rem 0 .5rem rgba(0,0,0,.1);
}
/* Only one tweak for a reverse layout */
.layout-reverse.sidebar-overlay #sidebar-checkbox:checked ~ .sidebar {
box-shadow: -.25rem 0 .5rem rgba(0,0,0,.1);
}

View file

@ -1 +1,22 @@
(import ./release.nix { }).project
{ nixpkgs ? import <nixpkgs> { }, compiler ? "default" }:
let
inherit (nixpkgs) pkgs;
haskellPackages = if compiler == "default" then
pkgs.haskellPackages
else
pkgs.haskell.packages.${compiler};
resrok-org = haskellPackages.callPackage ./resrok-web.nix { };
in nixpkgs.stdenv.mkDerivation {
name = "resrok-org-website";
buildInputs = [ resrok-org ];
src = ./.;
buildPhase = ''
echo "Setting LC_ALL to C.UTF-8 to avoid invalid byte sequence."
export LC_ALL=C.UTF-8
site build
'';
installPhase = ''
mkdir $out
cp -R _site/* $out
'';
}

View file

@ -12,15 +12,15 @@
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"nixpkgs": {
"branch": "nixpkgs-unstable",
"description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
"homepage": "https://github.com/NixOS/nixpkgs",
"owner": "NixOS",
"repo": "nixpkgs-channels",
"rev": "10100a97c8964e82b30f180fda41ade8e6f69e41",
"sha256": "011f36kr3c1ria7rag7px26bh73d1b0xpqadd149bysf4hg17rln",
"branch": "nixos-21.05",
"description": "Nix Packages collection",
"homepage": "",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "9e86f5f7a19db6da2445f07bafa6694b556f9c6d",
"sha256": "0i2j7bf6jq3s13n12xahramami0n6zn1mksqgi01k7flpgyymcck",
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs-channels/archive/10100a97c8964e82b30f180fda41ade8e6f69e41.tar.gz",
"url": "https://github.com/nixos/nixpkgs/archive/9e86f5f7a19db6da2445f07bafa6694b556f9c6d.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
}
}

View file

@ -6,52 +6,63 @@ let
# The fetchers. fetch_<type> fetches specs of type <type>.
#
fetch_file = pkgs: spec:
if spec.builtin or true then
builtins_fetchurl { inherit (spec) url sha256; }
else
pkgs.fetchurl { inherit (spec) url sha256; };
fetch_file = pkgs: name: spec:
let
name' = sanitizeName name + "-src";
in
if spec.builtin or true then
builtins_fetchurl { inherit (spec) url sha256; name = name'; }
else
pkgs.fetchurl { inherit (spec) url sha256; name = name'; };
fetch_tarball = pkgs: spec:
if spec.builtin or true then
builtins_fetchTarball { inherit (spec) url sha256; }
else
pkgs.fetchzip { inherit (spec) url sha256; };
fetch_tarball = pkgs: name: spec:
let
name' = sanitizeName name + "-src";
in
if spec.builtin or true then
builtins_fetchTarball { name = name'; inherit (spec) url sha256; }
else
pkgs.fetchzip { name = name'; inherit (spec) url sha256; };
fetch_git = spec:
builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; };
fetch_git = name: spec:
let
ref =
if spec ? ref then spec.ref else
if spec ? branch then "refs/heads/${spec.branch}" else
if spec ? tag then "refs/tags/${spec.tag}" else
abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!";
in
builtins.fetchGit { url = spec.repo; inherit (spec) rev; inherit ref; };
fetch_builtin-tarball = spec:
builtins.trace
''
WARNING:
The niv type "builtin-tarball" will soon be deprecated. You should
instead use `builtin = true`.
fetch_local = spec: spec.path;
$ niv modify <package> -a type=tarball -a builtin=true
''
builtins_fetchTarball { inherit (spec) url sha256; };
fetch_builtin-tarball = name: throw
''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`.
$ niv modify ${name} -a type=tarball -a builtin=true'';
fetch_builtin-url = spec:
builtins.trace
''
WARNING:
The niv type "builtin-url" will soon be deprecated. You should
instead use `builtin = true`.
$ niv modify <package> -a type=file -a builtin=true
''
(builtins_fetchurl { inherit (spec) url sha256; });
fetch_builtin-url = name: throw
''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`.
$ niv modify ${name} -a type=file -a builtin=true'';
#
# Various helpers
#
# https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695
sanitizeName = name:
(
concatMapStrings (s: if builtins.isList s then "-" else s)
(
builtins.split "[^[:alnum:]+._?=-]+"
((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name)
)
);
# The set of packages used when specs are fetched using non-builtins.
mkPkgs = sources:
mkPkgs = sources: system:
let
sourcesNixpkgs =
import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {};
import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; };
hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
hasThisAsNixpkgsPath = <nixpkgs> == ./.;
in
@ -71,14 +82,27 @@ let
if ! builtins.hasAttr "type" spec then
abort "ERROR: niv spec ${name} does not have a 'type' attribute"
else if spec.type == "file" then fetch_file pkgs spec
else if spec.type == "tarball" then fetch_tarball pkgs spec
else if spec.type == "git" then fetch_git spec
else if spec.type == "builtin-tarball" then fetch_builtin-tarball spec
else if spec.type == "builtin-url" then fetch_builtin-url spec
else if spec.type == "file" then fetch_file pkgs name spec
else if spec.type == "tarball" then fetch_tarball pkgs name spec
else if spec.type == "git" then fetch_git name spec
else if spec.type == "local" then fetch_local spec
else if spec.type == "builtin-tarball" then fetch_builtin-tarball name
else if spec.type == "builtin-url" then fetch_builtin-url name
else
abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}";
# If the environment variable NIV_OVERRIDE_${name} is set, then use
# the path directly as opposed to the fetched source.
replace = name: drv:
let
saneName = stringAsChars (c: if isNull (builtins.match "[a-zA-Z0-9]" c) then "_" else c) name;
ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}";
in
if ersatz == "" then drv else
# this turns the string into an actual Nix path (for both absolute and
# relative paths)
if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}";
# Ports of functions for older nix versions
# a Nix version of mapAttrs if the built-in doesn't exist
@ -87,23 +111,37 @@ let
listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set))
);
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295
range = first: last: if first > last then [] else builtins.genList (n: first + n) (last - first + 1);
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257
stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1));
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269
stringAsChars = f: s: concatStrings (map f (stringToCharacters s));
concatMapStrings = f: list: concatStrings (map f list);
concatStrings = builtins.concatStringsSep "";
# https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331
optionalAttrs = cond: as: if cond then as else {};
# fetchTarball version that is compatible between all the versions of Nix
builtins_fetchTarball = { url, sha256 }@attrs:
builtins_fetchTarball = { url, name ? null, sha256 }@attrs:
let
inherit (builtins) lessThan nixVersion fetchTarball;
in
if lessThan nixVersion "1.12" then
fetchTarball { inherit url; }
fetchTarball ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; }))
else
fetchTarball attrs;
# fetchurl version that is compatible between all the versions of Nix
builtins_fetchurl = { url, sha256 }@attrs:
builtins_fetchurl = { url, name ? null, sha256 }@attrs:
let
inherit (builtins) lessThan nixVersion fetchurl;
in
if lessThan nixVersion "1.12" then
fetchurl { inherit url; }
fetchurl ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; }))
else
fetchurl attrs;
@ -115,14 +153,15 @@ let
then abort
"The values in sources.json should not have an 'outPath' attribute"
else
spec // { outPath = fetch config.pkgs name spec; }
spec // { outPath = replace name (fetch config.pkgs name spec); }
) config.sources;
# The "config" used by the fetchers
mkConfig =
{ sourcesFile ? ./sources.json
, sources ? builtins.fromJSON (builtins.readFile sourcesFile)
, pkgs ? mkPkgs sources
{ sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null
, sources ? if isNull sourcesFile then {} else builtins.fromJSON (builtins.readFile sourcesFile)
, system ? builtins.currentSystem
, pkgs ? mkPkgs sources system
}: rec {
# The sources, i.e. the attribute set of spec name to spec
inherit sources;
@ -130,5 +169,6 @@ let
# The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
inherit pkgs;
};
in
mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }

View file

@ -2,6 +2,9 @@
title: About
---
We're the spiritual successor to `C@T`_.
"With the abolition of private property, then, we shall have true, beautiful,
healthy Individualism. Nobody will waste his life in accumulating things, and
the symbols for things. One will live. To live is the rarest thing in the
world. Most people exist, that is all."
.. _C@T:: https://web.archive.org/web/20070102063147/http://cat.org.au/
-- Oscar Wilde

View file

@ -2,4 +2,21 @@
title: Contact
---
You can contact the JFDI collective via our Matrix room.
We have always lived in slums and holes in the wall. We will know how to
accommodate ourselves for a while.
For you must not forget that we can also build.
It is we who built these palaces and cities, here in Spain and America and
everywhere. We, the workers. We can build others to take their place. And
better ones.
We are not in the least afraid of ruins.
We are going to inherit the earth; there is not the slightest doubt about that. The bourgeoisie might blast and ruin its own world before it leaves the stage of history.
We carry a new world here, in our hearts.
That world is growing in this minute.
-- Buenaventura Durruti

View file

@ -0,0 +1,30 @@
---
title: "Mutual Aid: A Factor Of Evolution"
author: Pyotr Kropotkin
tags: jfdi
---
Each time, however, that an attempt to return to this old principle was made,
it's fundamental idea itself was widened. From the clan it was extended to the
stem, to the federation of stems, to the nation, and finally—in ideal, at
least—to the whole of mankind. It was also refined at the same time. In
primitive Buddhism, in primitive Christianity, in the writings of some of the
Mussulman teachers, in the early movements of the Reform, and especially in the
ethical and philosophical movements of the last century and of our own times,
the total abandonment of the idea of revenge, or of “due reward”—of good for
good and evil for evil—is affirmed more and more vigorously. The higher
conception of “no revenge for wrongs,” and of freely giving more than one
expects to receive from his neighbours, is proclaimed as being the real
principle of morality—a principle superior to mere equivalence, equity, or
justice, and more conducive to happiness. And man is appealed to to be guided
in his acts, not merely by love, which is always personal, or at the best
tribal, but by the perception of his oneness with each human being.
In the practice of mutual aid, which we can retrace to the earliest
beginnings of evolution, we thus find the positive and undoubted origin of
our ethical conceptions;
and we can affirm that in the ethical progress of man, mutual support not
mutual struggle—has had the leading part. In its wide extension, even at the
present time, we also see the best guarantee of a still loftier evolution of
our species.

View file

@ -0,0 +1,20 @@
---
title: What I Believe
author: Emma Goldman
published: 1908-07-19
tags: skeleton
---
The student of the history of progressive thought is well aware that every idea
in its early stages has been misrepresented, and the adherents of such ideas
have been maligned and persecuted. One need not go back two thousand years to
the time when those who believed in the gospel of Jesus were thrown into the
arena or hunted into dungeons to realize how little great beliefs or earnest
believers are understood.
The history of progress is written in the blood of men and women who have
dared to espouse an unpopular cause, as, for instance, the black mans right
to his body, or womans right to her soul.
If, then, from time immemorial, the New has met with opposition and
condemnation, why should my beliefs be exempt from a crown of thorns?

View file

@ -0,0 +1,19 @@
---
title: The Dispossessed
author: Ursula K. Le Guin
published: 1974-05-01
tags: skeleton
---
It is our suffering that brings us together. It is not love. Love does not obey
the mind, and turns to hate when forced. The bond that binds us is beyond
choice. We are brothers. We are brothers in what we share. In pain, which each
of us must suffer alone, in hunger, in poverty, in hope, we know our
brotherhood. We know it, because we have had to learn it.
We know that there is no help for us but from one another, that no hand will
save us if we do not reach out our hand. And the hand that you reach out is
empty, as mine is.
You have nothing. You possess nothing. You own nothing. You are free. All you have
is what you are, and what you give.

View file

@ -0,0 +1,19 @@
---
title: Connotations of Anarchy
author: Dr Joseph Toscano
published: 1986-05-01
tags: skeleton
---
Anarchy is a bogey word: we are coming out of the closet, as it were, to show
that we do not have horns or tails. We are simply Australians who have a
different philosophy of life. We don't believe in Big Government: in fact, we
don't believe in government at all. Government, any government is based on
violence and power. If you don't believe it, just look at your headlines over
the past few weeks.
Anarchy doesn't mean bombs in the street or supersonic bomber raids, it
means 'without rulers'.
Anarchy means voluntary co-operation and self-management, equality, shared
economic decision making.

View file

@ -1,60 +0,0 @@
---
title: S.P.Q.R.
tags: Mauris, lorem
---
Mauris in lorem nisl. Maecenas tempus facilisis ante, eget viverra nisl
tincidunt et. Donec turpis lectus, mattis ac malesuada a, accumsan eu libero.
Morbi condimentum, tortor et tincidunt ullamcorper, sem quam pretium nulla, id
convallis lectus libero nec turpis. Proin dapibus nisi id est sodales nec
ultrices tortor pellentesque. Vivamus vel nisi ac lacus sollicitudin vulputate
ac ut ligula. Nullam feugiat risus eget eros gravida in molestie sapien euismod.
Nunc sed hendrerit orci. Nulla mollis consequat lorem ac blandit. Ut et turpis
mauris. Nulla est odio, posuere id ullamcorper sit amet, tincidunt vel justo.
Curabitur placerat tincidunt varius. Nulla vulputate, ipsum eu consectetur
mollis, dui nibh aliquam neque, at ultricies leo ligula et arcu. Proin et mi
eget tellus sodales lobortis. Sed tempor, urna vel pulvinar faucibus, lectus
urna vehicula ante, at facilisis dolor odio at lorem. Morbi vehicula euismod
urna, et imperdiet urna ornare vitae.
Sed tincidunt sollicitudin ultrices. In hac habitasse platea dictumst. Morbi
ligula lectus, egestas at ultricies nec, fringilla et tellus. Duis urna lorem,
bibendum a ornare sed, euismod sed nunc. Aliquam tempor massa at velit fringilla
fringilla. Praesent sit amet tempor felis. Maecenas id felis ac velit aliquam
tempor a sit amet orci. Nunc placerat nulla pellentesque sem commodo cursus.
Praesent quis sapien orci, quis ultricies augue. Nam vestibulum sem non augue
semper tincidunt pellentesque ipsum volutpat. Duis congue, nunc a aliquam
luctus, quam ante convallis nisi, ac pellentesque lacus orci vel turpis. Cum
sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Suspendisse hendrerit nisl eu felis sagittis faucibus. Nunc eu congue
lorem. Quisque non nibh nisi, et ultrices massa. Sed vitae erat vitae nulla
pellentesque fermentum.
Ut diam nunc, consectetur ut ultrices eu, iaculis sed felis. Sed lacinia, odio
et accumsan luctus, arcu ipsum accumsan erat, sit amet malesuada libero lacus et
velit. Donec accumsan tristique tristique. Proin a metus magna, vitae mattis
nisl. Integer a libero ipsum. Mauris faucibus eleifend metus id sodales. Morbi
ornare, nibh nec facilisis imperdiet, turpis sem commodo lorem, id commodo
mauris metus vitae justo. Etiam at pellentesque tortor. Proin mollis accumsan
ligula, nec tempus augue auctor quis. Nulla lacinia, mi quis lobortis auctor,
nisi diam posuere dui, pulvinar feugiat dui libero eget quam. Fusce eu risus
nunc, a consectetur orci. Class aptent taciti sociosqu ad litora torquent per
conubia nostra, per inceptos himenaeos. Maecenas venenatis aliquet orci, a
ultricies sem facilisis eu. Donec dolor purus, porta condimentum convallis nec,
dignissim nec libero.
Etiam rutrum ultricies dui, et interdum metus elementum et. Nulla sapien nunc,
interdum tristique porttitor in, laoreet vitae mi. Ut vehicula auctor mauris sit
amet bibendum. Phasellus adipiscing mattis libero, eget adipiscing erat
dignissim at. Vivamus convallis malesuada metus nec cursus. Ut cursus, lorem
eleifend sollicitudin condimentum, felis tortor sodales augue, ac tempus lacus
ipsum vitae quam. Vestibulum vitae lacus non tortor vehicula iaculis faucibus
quis massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Duis malesuada neque nec ante porttitor accumsan. Suspendisse potenti.
Aliquam in lacus magna, imperdiet laoreet lectus. Praesent id diam nec ante
commodo rhoncus nec vel augue. Pellentesque tortor massa, dignissim ut sagittis
sed, hendrerit vitae nunc. Nam gravida, urna vitae hendrerit rutrum, felis augue
vulputate tortor, ut varius velit libero nec lectus. In adipiscing massa in est
scelerisque ullamcorper. Vivamus in nisi metus.

View file

@ -1,47 +0,0 @@
---
title: Rosa Rosa Rosam
author: Ovidius
tags: lorem
---
Suspendisse pharetra ullamcorper sem et auctor. Suspendisse vitae tellus eu
turpis dignissim gravida ut ut tortor. Cum sociis natoque penatibus et magnis
dis parturient montes, nascetur ridiculus mus. Morbi aliquam sapien quis nisl
sodales non aliquet nisl iaculis. Curabitur fermentum orci vel sapien
pellentesque id condimentum metus vehicula. Curabitur turpis purus, scelerisque
at interdum quis, placerat sit amet tortor. Aliquam erat volutpat.
Integer posuere felis non arcu suscipit ullamcorper. Nam tempus risus venenatis
orci sagittis eu aliquam ante tincidunt. Aenean vehicula ipsum id sapien
tincidunt commodo. Aliquam erat volutpat. Curabitur vehicula libero ac turpis
cursus consectetur. Praesent posuere egestas purus et dapibus. Mauris egestas,
lectus vitae scelerisque ultricies, metus lorem tempor nisi, sed vehicula tortor
mauris nec urna. Quisque urna tellus, facilisis at mollis eget, adipiscing in
nisl. Proin quam arcu, euismod et imperdiet sed, ultricies sed orci.
Nulla malesuada sem eget lectus scelerisque nec rhoncus metus interdum. In dui
felis, rhoncus id scelerisque eget, vulputate id sem. Nulla facilisi. Vestibulum
eleifend, metus dignissim lacinia ornare, magna nulla vehicula nisi, sed
molestie mauris ipsum vel turpis. Class aptent taciti sociosqu ad litora
torquent per conubia nostra, per inceptos himenaeos. Nulla urna leo, vehicula
eget dignissim a, hendrerit ut risus. Fusce ultricies elementum placerat. Nam at
dolor sed nisi mollis sollicitudin vitae at urna. Vestibulum iaculis adipiscing
eros et mollis.
Phasellus ultricies elit eu risus sagittis eu dictum ante ultrices. Nulla
congue, augue ac placerat tempor, orci mi luctus nisi, at varius ipsum sem sed
eros. Vivamus eget velit eget felis posuere ornare. In sed metus non est iaculis
facilisis dapibus sit amet enim. Aliquam viverra tortor eget neque volutpat in
auctor urna rutrum. Aliquam ligula augue, congue sit amet rutrum in, semper vel
nulla. Sed tempus porttitor faucibus. Donec cursus sodales nulla, quis lacinia
mi vehicula vel. Sed nec purus orci. Nam leo sapien, rutrum a ultrices quis,
placerat vel ligula. Donec massa quam, pellentesque et molestie nec, hendrerit
id mauris. In hac habitasse platea dictumst. Cras quis quam sem. Curabitur in
arcu diam, in interdum mauris.
Proin lorem sapien, iaculis et faucibus nec, dictum sed nunc. Pellentesque in
purus justo. Vestibulum facilisis rutrum nisi, a egestas nunc suscipit sed. Ut
quis tortor a arcu bibendum placerat non sed ante. Praesent orci sem, posuere
sit amet cursus molestie, volutpat ut purus. Curabitur aliquam, purus in
pharetra viverra, lorem leo aliquam tellus, vel consequat felis neque et mauris.
Aliquam erat volutpat.

View file

@ -1,51 +0,0 @@
---
title: Carpe Diem
tags: lorem, quam
---
Fusce tortor quam, egestas in posuere quis, porttitor vel turpis. Donec
vulputate porttitor augue at rhoncus. Proin iaculis consectetur sagittis.
Curabitur venenatis turpis sit amet purus tristique nec posuere risus laoreet.
Nullam nisi sem, dapibus id semper id, egestas vel arcu. Morbi porttitor ipsum
placerat erat consequat sed consequat purus feugiat. Donec auctor elit ut risus
mattis facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Proin vulputate sapien facilisis leo ornare pulvinar. Fusce tempus massa a risus
semper iaculis. Suspendisse sollicitudin posuere nunc, sit amet rutrum leo
facilisis mattis. Sed ornare auctor dui, vitae rutrum neque auctor sit amet.
Proin ac dui magna. Mauris vehicula interdum augue, nec ultrices libero egestas
quis. Nunc convallis euismod ipsum, id sollicitudin orci consequat ac. Fusce
bibendum congue libero, in rutrum nulla congue non. Cras sit amet risus tortor,
eu pellentesque dui. Phasellus euismod enim non nibh sodales quis consectetur
lorem laoreet. Vivamus a egestas quam. Curabitur in tortor augue, vitae varius
tellus. Integer varius, elit ac gravida suscipit, eros erat pellentesque nisi,
et tristique augue odio id nulla. Aliquam sit amet nunc vel tellus hendrerit
tempus ac vel sem.
Aenean tincidunt sollicitudin sapien ut porttitor. Curabitur molestie adipiscing
lorem vel scelerisque. Donec vitae interdum est. Proin rutrum vulputate
faucibus. Suspendisse sit amet felis odio, non volutpat ante. Sed eu lectus
quam. Curabitur tristique rhoncus est, vel commodo tortor suscipit semper.
Maecenas feugiat vestibulum nisi id facilisis. Nulla non tincidunt libero.
Praesent ultrices interdum commodo. Sed euismod nisl auctor leo ultrices rutrum.
Aliquam nibh felis, congue molestie blandit at, bibendum at eros. Aenean
tincidunt, tortor iaculis placerat sollicitudin, lorem justo tempor diam, et
posuere sapien leo et magna. Quisque vel aliquam mauris.
Proin varius tempus fermentum. Cum sociis natoque penatibus et magnis dis
parturient montes, nascetur ridiculus mus. Sed tincidunt nunc id magna
adipiscing non sollicitudin turpis tempor. Etiam vel elit ipsum, quis euismod
velit. Quisque elementum magna vitae quam venenatis lacinia. Sed at arcu ipsum.
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos
himenaeos. Donec ut lorem ac sapien cursus lacinia sit amet mollis dolor.
Vivamus tempus odio nec magna faucibus sed hendrerit lorem tempor.
Vestibulum eu nisi arcu. Curabitur nisi risus, fermentum ut lacinia ut, interdum
nec magna. Nunc aliquet gravida massa, eu aliquam lorem faucibus at. Sed
sollicitudin volutpat velit id tempor. In nibh justo, pharetra et pretium
dignissim, tempus in turpis. Phasellus eget lobortis nisl. Phasellus sed
fermentum diam. Nam tempus pharetra odio, quis congue eros imperdiet eu. Aliquam
dui eros, hendrerit et vulputate vel, porta eu eros. Nullam nisi dui, commodo
eget pharetra ut, ornare sit amet nunc. Fusce vel neque urna. Maecenas nulla
ante, egestas at consequat quis, fermentum a enim. Aliquam id tristique urna.
Integer augue justo, scelerisque et consectetur id, rhoncus eget enim.

View file

@ -1,59 +0,0 @@
---
title: Tu Quoque
author: Julius
tags: lorem, quam
---
Vestibulum leo turpis, dignissim quis ultrices sit amet, iaculis ac ligula.
Pellentesque tristique, velit eget scelerisque scelerisque, est dolor ultrices
arcu, quis ullamcorper justo arcu luctus mauris. Integer congue molestie nisi id
posuere. Fusce pellentesque gravida tempus. Integer viverra tortor nec eros
mollis quis convallis sem laoreet. Nulla id libero ac erat varius laoreet. Proin
sed est est. Curabitur lacinia fermentum lorem, elementum malesuada ipsum
malesuada ut. Donec suscipit elit id leo vehicula mattis non sed leo. Morbi
varius eleifend varius. Nulla vestibulum, neque vitae aliquam eleifend, nisi
tellus placerat nunc, quis suscipit elit turpis eu tortor. Etiam euismod
convallis lectus quis venenatis. Phasellus laoreet magna in nibh cursus eu
egestas nulla convallis. Aliquam vel ullamcorper risus. Fusce dictum, massa id
consequat viverra, nulla ante tristique est, a faucibus nisi enim nec dui. Donec
metus ligula, condimentum at porttitor eget, lobortis at quam.
Aenean vel libero in magna ultricies congue in a odio. Donec faucibus rutrum
ornare. Fusce dictum eleifend fermentum. Vestibulum vel nibh a metus porttitor
rhoncus. Pellentesque id quam neque, eget molestie arcu. Integer in elit vel
neque viverra ultricies in eget massa. Nam ut convallis est. Pellentesque eros
eros, sodales non vehicula et, tincidunt ut odio. Cras suscipit ultrices metus
sit amet molestie. Fusce enim leo, vehicula sed sodales quis, adipiscing at
ipsum.
Nunc tempor dignissim enim, sed tincidunt eros bibendum quis. Curabitur et dolor
augue, id laoreet mi. Nulla cursus felis id dui vehicula vitae ornare lorem
blandit. Cras eget dui nec odio volutpat pharetra. Fusce hendrerit justo justo,
vel imperdiet enim. Vivamus elit risus, interdum ultrices accumsan eleifend,
vestibulum vitae sapien. Integer bibendum ullamcorper tristique. Nulla quis odio
lectus, quis eleifend augue. Integer a ligula mauris. Aenean et tempus tortor.
Quisque at tortor mi. Vivamus accumsan feugiat est a blandit. Sed vitae enim ut
dolor semper sodales. Duis tristique, ante et placerat elementum, nulla tellus
pellentesque sapien, quis posuere velit mi eget nulla. Sed vestibulum nunc non
est porttitor ut rutrum nibh semper. Pellentesque habitant morbi tristique
senectus et netus et malesuada fames ac turpis egestas.
Nulla adipiscing ultricies lobortis. Vivamus iaculis nisl vitae tellus laoreet
vitae aliquet lacus mollis. Phasellus ut lacus urna, sed sagittis ante. Etiam
consectetur pretium nisl sed dignissim. Pellentesque convallis, nisl eget
commodo mollis, sem magna consequat arcu, sed pretium ipsum arcu sit amet neque.
Aliquam erat volutpat. Morbi sed mi sed urna vestibulum placerat vitae vel
metus. Fusce ac ante at justo pharetra vehicula. Vivamus vel tortor eget augue
aliquet aliquet at vel odio. Nunc venenatis, magna quis facilisis fringilla,
augue tellus varius neque, in vulputate est eros ut tortor. Duis lorem neque,
aliquam congue posuere id, condimentum non dui. Phasellus ut dui massa,
porttitor suscipit augue. Praesent quis tellus quam, vel volutpat metus. Vivamus
enim est, aliquam in imperdiet et, sagittis eu ligula. Vestibulum hendrerit
placerat orci et aliquet. Cras pharetra, dolor placerat lobortis tempor, metus
odio cursus ligula, et posuere lacus ligula quis dui.
Donec a lectus eu nibh malesuada aliquam. Proin at metus quam, et tincidunt leo.
Quisque lacus justo, scelerisque sodales pulvinar sed, dignissim ut sapien.
Vivamus diam felis, adipiscing sollicitudin ultricies id, accumsan ac felis. In
eu posuere ligula. Suspendisse potenti. Donec porttitor dictum dui id vehicula.
Integer ante velit, congue id dictum et, adipiscing a tortor.

View file

@ -1,9 +1,5 @@
let
sources = import ./nix/sources.nix;
in
{ compiler ? "ghc883"
, pkgs ? import sources.nixpkgs { }
}:
let sources = import ./nix/sources.nix;
in { compiler ? "ghc8104", pkgs ? import sources.nixpkgs { } }:
let
inherit (pkgs.lib.trivial) flip pipe;
@ -11,12 +7,10 @@ let
haskellPackages = pkgs.haskell.packages.${compiler}.override {
overrides = hpNew: hpOld: {
hakyll =
pipe
hpOld.hakyll
[ (flip appendPatch ./hakyll.patch)
(flip appendConfigureFlags [ "-f" "watchServer" "-f" "previewServer" ])
];
hakyll = pipe hpOld.hakyll [
(flip appendPatch ./hakyll.patch)
(flip appendConfigureFlags [ "-f" "watchServer" "-f" "previewServer" ])
];
resrok-web = hpNew.callCabal2nix "resrok-web" ./. { };
@ -25,22 +19,16 @@ let
};
project = haskellPackages.resrok-web;
in
{
in {
project = project;
shell = haskellPackages.shellFor {
packages = p: with p; [
project
packages = p: with p; [ project ];
buildInputs = with haskellPackages; [
ghcid # GHCi based IDE
hlint # or ormolu
pkgs.niv # Nix dependency management
];
#buildInputs = with haskellPackages; [
# ghcid
# hlint # or ormolu
# niv
# pkgs.cacert # needed for niv
# pkgs.nix # needed for niv
# zlib
#];
withHoogle = true;
};
}

View file

@ -1,4 +1,4 @@
name: jfdic-web
name: resrok-web
version: 0.1.0.0
build-type: Simple
cabal-version: >= 1.10

View file

@ -1,6 +1,6 @@
{ mkDerivation, base, hakyll, stdenv }:
mkDerivation {
pname = "jfdic-web";
pname = "resrok-web";
version = "0.1.0.0";
src = ./.;
isLibrary = false;

View file

@ -120,7 +120,7 @@ feedConfig :: FeedConfiguration
feedConfig = FeedConfiguration
{ feedTitle = "Resilient Rockhampton"
, feedDescription = "All We Have Is Each Other"
, feedAuthorName = "Resilient Rockhampton"
, feedAuthorName = "the collective"
, feedAuthorEmail = "collective@resrok.org"
, feedRoot = "https://resrok.org"
}
@ -135,11 +135,11 @@ siteCtx =
constField "tagline" "All We Have Is Each Other" `mappend`
constField "site-title" "Resilient Rockhampton" `mappend`
constField "copy-year" "2021" `mappend`
constField "github-repo" "https://source.resrok.org/resrok/resrok-web" `mappend`
constField "github-repo" "https://source.jfdic.org/resrok/resrok-web" `mappend`
defaultContext
baseCtx =
constField "baseurl" "http://localhost:8000"
constField "baseurl" "https://resrok.org"
--------------------------------------------------------------------------------

View file

@ -13,6 +13,7 @@
<div class="masthead">
<div class="container">
<h3 class="masthead-title">
<img src=/images/hakyll-logo.svg" class=logo style="display: inline;"/>
<a href="$baseurl$" title="Home">$site-title$</a>
<small>$tagline$</small>
</h3>
@ -26,7 +27,7 @@
<label for="sidebar-checkbox" class="sidebar-toggle"></label>
<script src='$baseurl$/public/js/script.js'></script>
<script src="/js/script.js"></script>
</body>

View file

@ -20,9 +20,9 @@
$endif$
$endif$
<link rel="stylesheet" href="$baseurl$/css/base.css">
<link rel="stylesheet" href="$baseurl$/css/syntax.css">
<link rel="stylesheet" href="$baseurl$/css/jfdic.css">
<link rel="stylesheet" href="/css/base.css">
<link rel="stylesheet" href="/css/syntax.css">
<link rel="stylesheet" href="/css/resrok.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Serif:400,400italic,700%7CPT+Sans:400">
<!---

View file

@ -9,17 +9,17 @@
</div>
<nav class="sidebar-nav">
<a class="sidebar-nav-item$if(home)$ active$endif$" href="$baseurl$">Home</a>
<a class="sidebar-nav-item$if(home)$ active$endif$" href="/">Home</a>
<!--- The code below dynamically generates a sidebar nav of the files in the folder /pages -->
$for(list_pages)$
$if(title)$
<a class="sidebar-nav-item$if(eval(title))$ active$endif$" href="$baseurl$$node-url$">$title$</a>
<a class="sidebar-nav-item$if(eval(title))$ active$endif$" href="$node-url$">$title$</a>
$endif$
$endfor$
<a class="sidebar-nav-item$if(archive)$ active$endif$" href="$baseurl$/archive.html">Archive</a>
<a class="sidebar-nav-item$if(archive)$ active$endif$" href="/archive.html">Archive</a>
<a class="sidebar-nav-item" href="$github-repo$">GitHub project</a>
@ -30,7 +30,7 @@
&copy; $copy-year$. All rights reserved.
</p>
<p>
<img src="$baseurl$/images/haskell-logo.png" class=logo style="display: inline;"/>
<img src="/images/haskell-logo.png" class=logo style="display: inline;"/>
Site created with
<a href="https://jaspervdj.be/hakyll">Hakyll</a>.
</p>