diff --git a/themes/mnemosyne/LICENSE b/themes/mnemosyne/LICENSE
new file mode 100644
index 0000000..c59d9a6
--- /dev/null
+++ b/themes/mnemosyne/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2021 Jez Cope
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/themes/mnemosyne/README.md b/themes/mnemosyne/README.md
new file mode 100644
index 0000000..ef2f155
--- /dev/null
+++ b/themes/mnemosyne/README.md
@@ -0,0 +1,33 @@
+# Mnemosyne: a minimal Hugo theme
+
+This is the theme that I use for [my blog, eRambler](https://erambler.co.uk).
+
+## Installation
+
+In your Hugo site `themes` directory, run:
+
+```
+git clone https://tildegit.org/petrichor/theme-mnemosyne-hugo.git
+```
+
+Next, open `config.toml` in the base of the Hugo site and ensure the theme option is set to `mnemosyne`.
+
+```
+theme = "mnemosyne"
+```
+
+For more information read the official [quick start guide](https://gohugo.io/getting-started/quick-start/) of Hugo.
+
+## Contributing
+
+I don't really have time to test & accept contributions, but feel free to fork this theme and do your own thing with it.
+
+## License
+
+This theme is released under the [MIT license](https://tildegit.org/petrichor/theme-mnemosyne-hugo/src/branch/main/LICENSE).
+
+## Acknowledgements
+
+This theme is based on: [Blank][], a starter [Hugo](https://gohugo.io/) theme for developers. Use it to make your own theme.
+
+[Blank]: https://themes.gohugo.io/theme/blank/
diff --git a/themes/mnemosyne/archetypes/default.md b/themes/mnemosyne/archetypes/default.md
new file mode 100644
index 0000000..ef75f76
--- /dev/null
+++ b/themes/mnemosyne/archetypes/default.md
@@ -0,0 +1,4 @@
++++
+title = "{{ replace .Name "-" " " | title }}"
+date = {{ .Date }}
++++
diff --git a/themes/mnemosyne/assets/js/webmention.js b/themes/mnemosyne/assets/js/webmention.js
new file mode 100644
index 0000000..fc87fd8
--- /dev/null
+++ b/themes/mnemosyne/assets/js/webmention.js
@@ -0,0 +1,342 @@
+/* webmention.js
+
+Simple thing for embedding webmentions from webmention.io into a page, client-side.
+
+(c)2018-2020 fluffy (http://beesbuzz.biz)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+GitHub repo (for latest released versions, issue tracking, etc.):
+
+ https://github.com/PlaidWeb/webmention.js
+
+Basic usage:
+
+
+
+
+Allowed parameters:
+
+ page-url:
+
+ The base URL to use for this page. Defaults to window.location
+
+ add-urls:
+
+ Additional URLs to check, separated by |s
+
+ id:
+
+ The HTML ID for the object to fill in with the webmention data.
+ Defaults to "webmentions"
+
+ wordcount:
+
+ The maximum number of words to render in reply mentions.
+
+ max-webmentions:
+
+ The maximum number of mentions to retrieve. Defaults to 30.
+
+ prevent-spoofing:
+
+ By default, Webmentions render using the mf2 'url' element, which plays
+ nicely with webmention bridges (such as brid.gy and telegraph)
+ but allows certain spoofing attacks. If you would like to prevent
+ spoofing, set this to a non-empty string (e.g. "true").
+
+ sort-by:
+
+ What to order the responses by; defaults to 'published'. See
+ https://github.com/aaronpk/webmention.io#api
+
+ sort-dir:
+
+ The order to sort the responses by; defaults to 'up' (i.e. oldest
+ first). See https://github.com/aaronpk/webmention.io#api
+
+ comments-are-reactions:
+
+ If set to a non-empty string (e.g. "true"), will display comment-type responses
+ (replies/mentions/etc.) as being part of the reactions
+ (favorites/bookmarks/etc.) instead of in a separate comment list.
+
+A more detailed example:
+
+
+
+*/
+
+
+(function () {
+ "use strict";
+
+ function getCfg(key, dfl) {
+ return document.currentScript.getAttribute("data-" + key) || dfl;
+ }
+
+ var refurl = getCfg('page-url',
+ window.location.href.replace(/#.*$/, ''));
+ var addurls = getCfg('add-urls', undefined);
+ var containerID = getCfg('id', "webmentions");
+ var textMaxWords = getCfg('wordcount');
+ var maxWebmentions = getCfg('max-webmentions', 30);
+ var mentionSource = getCfg('prevent-spoofing') ? 'wm-source' : 'url';
+ var sortBy = getCfg('sort-by', 'published');
+ var sortDir = getCfg('sort-dir', 'up');
+ var commentsAreReactions = getCfg('comments-are-reactions');
+
+ var reactTitle = {
+ 'in-reply-to': 'replied',
+ 'like-of': 'liked',
+ 'repost-of': 'reposted',
+ 'bookmark-of': 'bookmarked',
+ 'mention-of': 'mentioned',
+ 'rsvp': 'RSVPed',
+ 'follow-of': 'followed'
+ };
+
+ var reactEmoji = {
+ 'in-reply-to': '💬',
+ 'like-of': '❤️',
+ 'repost-of': '🔄',
+ 'bookmark-of': '⭐️',
+ 'mention-of': '💬',
+ 'rsvp': '📅',
+ 'follow-of': '🐜'
+ };
+
+ var rsvpEmoji = {
+ 'yes': '✅',
+ 'no': '❌',
+ 'interested': '💡',
+ 'maybe': '💭'
+ };
+
+ function entities(text) {
+ return text.replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"');
+ }
+
+ function reactImage(r, isComment) {
+ var who = entities((r.author && r.author.name)
+ ? r.author.name
+ : r.url.split('/')[2]);
+ var response = reactTitle[r['wm-property']] || 'reacted';
+ if (!isComment && r.content && r.content.text) {
+ response += ": " + extractComment(r);
+ }
+ var html = '';
+ if (r.author && r.author.photo) {
+ html += ' ';
+ }
+ html += (reactEmoji[r['wm-property']] || '💥');
+ if (r.rsvp && rsvpEmoji[r.rsvp]) {
+ html += '' + rsvpEmoji[r.rsvp] + ' ';
+ }
+ html += ' ';
+
+ return html;
+ }
+
+ // strip the protocol off a URL
+ function stripurl(url) {
+ return url.substr(url.indexOf('//'));
+ }
+
+ // Deduplicate multiple mentions from the same source URL
+ function dedupe(mentions) {
+ var filtered = [];
+ var seen = {};
+
+ mentions.forEach(function(r) {
+ // Strip off the protocol (i.e. treat http and https the same)
+ var source = stripurl(r.url);
+ if (!seen[source]) {
+ filtered.push(r);
+ seen[source] = true;
+ }
+ });
+
+ return filtered;
+ }
+
+ function extractComment(c) {
+ var text = entities(c.content.text);
+
+ if (textMaxWords) {
+ var words = text.replace(/\s+/g,' ')
+ .split(' ', textMaxWords + 1);
+ if (words.length > textMaxWords) {
+ words[textMaxWords - 1] += '…';
+ words = words.slice(0, textMaxWords);
+ text = words.join(' ');
+ }
+ }
+
+ return text;
+ }
+
+ function formatComments(comments) {
+ var html = '' + comments.length + ' Response' +
+ (comments.length > 1 ? 's' : '') +
+ ' ';
+
+ return html;
+ }
+
+ function formatReactions(reacts) {
+ var html = '' + reacts.length + ' Reaction' +
+ (reacts.length > 1 ? 's' : '') +
+ ' ';
+
+ reacts.forEach(function(r) {
+ html += reactImage(r);
+ });
+
+ return html;
+ }
+
+ function getData(url, callback) {
+ if (window.fetch) {
+ window.fetch(url).then(function(response) {
+ if (response.status >= 200 && response.status < 300) {
+ return Promise.resolve(response);
+ } else {
+ return Promise.reject(new Error(response.statusText));
+ }
+ }).then(function(response) {
+ return response.json();
+ }).then(callback).catch(function(error) {
+ console.error("Request failed", error);
+ });
+ } else {
+ var oReq = new XMLHttpRequest();
+ oReq.onload = function(data) {
+ callback(JSON.parse(data));
+ };
+ oReq.onerror = function(error) {
+ console.error("Request failed", error);
+ };
+ }
+ }
+
+ window.addEventListener("load", function () {
+ var container = document.getElementById(containerID);
+ if (!container) {
+ // no container, so do nothing
+ return;
+ }
+
+ var pages = [stripurl(refurl)];
+ if (!!addurls) {
+ addurls.split('|').forEach(function (url) {
+ pages.push(stripurl(url));
+ })
+ }
+
+ var apiURL = 'https://webmention.io/api/mentions.jf2?per-page=' +
+ maxWebmentions + '&sort-by=' + sortBy + '&sort-dir=' + sortDir;
+
+ pages.forEach(function (path) {
+ apiURL += '&target[]=' + encodeURIComponent('http:' + path) +
+ '&target[]=' + encodeURIComponent('https:' + path);
+ });
+
+ getData(apiURL, function(json) {
+ var html = '';
+
+ var comments = [];
+ var collects = [];
+ if (commentsAreReactions) {
+ comments = collects;
+ }
+
+ var mapping = {
+ "in-reply-to": comments,
+ "like-of": collects,
+ "repost-of": collects,
+ "bookmark-of": collects,
+ "mention-of": comments,
+ "rsvp": comments
+ };
+
+ json.children.forEach(function(c) {
+ var store = mapping[c['wm-property']];
+ if (store) {
+ store.push(c);
+ }
+ });
+
+ // format the comment-type things
+ if (comments.length > 0 && comments !== collects) {
+ html += formatComments(dedupe(comments));
+ }
+
+ // format the other reactions
+ if (collects.length > 0) {
+ html += formatReactions(dedupe(collects));
+ }
+
+ container.innerHTML = html;
+ });
+ });
+
+}());
diff --git a/themes/mnemosyne/assets/style/_code.scss b/themes/mnemosyne/assets/style/_code.scss
new file mode 100644
index 0000000..8e37fe9
--- /dev/null
+++ b/themes/mnemosyne/assets/style/_code.scss
@@ -0,0 +1,82 @@
+/* Background */ .chroma { color: #93a1a1; background-color: #002b36 }
+/* Other */ .chroma .x { color: #cb4b16 }
+/* Error */ .chroma .err { }
+/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
+/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; }
+/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc }
+/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #495050 }
+/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #495050 }
+/* Keyword */ .chroma .k { color: #719e07 }
+/* KeywordConstant */ .chroma .kc { color: #cb4b16 }
+/* KeywordDeclaration */ .chroma .kd { color: #268bd2 }
+/* KeywordNamespace */ .chroma .kn { color: #719e07 }
+/* KeywordPseudo */ .chroma .kp { color: #719e07 }
+/* KeywordReserved */ .chroma .kr { color: #268bd2 }
+/* KeywordType */ .chroma .kt { color: #dc322f }
+/* Name */ .chroma .n { }
+/* NameAttribute */ .chroma .na { }
+/* NameBuiltin */ .chroma .nb { color: #b58900 }
+/* NameBuiltinPseudo */ .chroma .bp { color: #268bd2 }
+/* NameClass */ .chroma .nc { color: #268bd2 }
+/* NameConstant */ .chroma .no { color: #cb4b16 }
+/* NameDecorator */ .chroma .nd { color: #268bd2 }
+/* NameEntity */ .chroma .ni { color: #cb4b16 }
+/* NameException */ .chroma .ne { color: #cb4b16 }
+/* NameFunction */ .chroma .nf { color: #268bd2 }
+/* NameFunctionMagic */ .chroma .fm { }
+/* NameLabel */ .chroma .nl { }
+/* NameNamespace */ .chroma .nn { }
+/* NameOther */ .chroma .nx { }
+/* NameProperty */ .chroma .py { }
+/* NameTag */ .chroma .nt { color: #268bd2 }
+/* NameVariable */ .chroma .nv { color: #268bd2 }
+/* NameVariableClass */ .chroma .vc { }
+/* NameVariableGlobal */ .chroma .vg { }
+/* NameVariableInstance */ .chroma .vi { }
+/* NameVariableMagic */ .chroma .vm { }
+/* Literal */ .chroma .l { }
+/* LiteralDate */ .chroma .ld { }
+/* LiteralString */ .chroma .s { color: #2aa198 }
+/* LiteralStringAffix */ .chroma .sa { color: #2aa198 }
+/* LiteralStringBacktick */ .chroma .sb { color: #586e75 }
+/* LiteralStringChar */ .chroma .sc { color: #2aa198 }
+/* LiteralStringDelimiter */ .chroma .dl { color: #2aa198 }
+/* LiteralStringDoc */ .chroma .sd { }
+/* LiteralStringDouble */ .chroma .s2 { color: #2aa198 }
+/* LiteralStringEscape */ .chroma .se { color: #cb4b16 }
+/* LiteralStringHeredoc */ .chroma .sh { }
+/* LiteralStringInterpol */ .chroma .si { color: #2aa198 }
+/* LiteralStringOther */ .chroma .sx { color: #2aa198 }
+/* LiteralStringRegex */ .chroma .sr { color: #dc322f }
+/* LiteralStringSingle */ .chroma .s1 { color: #2aa198 }
+/* LiteralStringSymbol */ .chroma .ss { color: #2aa198 }
+/* LiteralNumber */ .chroma .m { color: #2aa198 }
+/* LiteralNumberBin */ .chroma .mb { color: #2aa198 }
+/* LiteralNumberFloat */ .chroma .mf { color: #2aa198 }
+/* LiteralNumberHex */ .chroma .mh { color: #2aa198 }
+/* LiteralNumberInteger */ .chroma .mi { color: #2aa198 }
+/* LiteralNumberIntegerLong */ .chroma .il { color: #2aa198 }
+/* LiteralNumberOct */ .chroma .mo { color: #2aa198 }
+/* Operator */ .chroma .o { color: #719e07 }
+/* OperatorWord */ .chroma .ow { color: #719e07 }
+/* Punctuation */ .chroma .p { }
+/* Comment */ .chroma .c { color: #586e75 }
+/* CommentHashbang */ .chroma .ch { color: #586e75 }
+/* CommentMultiline */ .chroma .cm { color: #586e75 }
+/* CommentSingle */ .chroma .c1 { color: #586e75 }
+/* CommentSpecial */ .chroma .cs { color: #719e07 }
+/* CommentPreproc */ .chroma .cp { color: #719e07 }
+/* CommentPreprocFile */ .chroma .cpf { color: #719e07 }
+/* Generic */ .chroma .g { }
+/* GenericDeleted */ .chroma .gd { color: #dc322f }
+/* GenericEmph */ .chroma .ge { font-style: italic }
+/* GenericError */ .chroma .gr { color: #dc322f; font-weight: bold }
+/* GenericHeading */ .chroma .gh { color: #cb4b16 }
+/* GenericInserted */ .chroma .gi { color: #719e07 }
+/* GenericOutput */ .chroma .go { }
+/* GenericPrompt */ .chroma .gp { }
+/* GenericStrong */ .chroma .gs { font-weight: bold }
+/* GenericSubheading */ .chroma .gu { color: #268bd2 }
+/* GenericTraceback */ .chroma .gt { }
+/* GenericUnderline */ .chroma .gl { }
+/* TextWhitespace */ .chroma .w { }
diff --git a/themes/mnemosyne/assets/style/_variables.scss b/themes/mnemosyne/assets/style/_variables.scss
new file mode 100644
index 0000000..8d54032
--- /dev/null
+++ b/themes/mnemosyne/assets/style/_variables.scss
@@ -0,0 +1,3 @@
+$main-font-family: 'Iosevka Etoile', sans-serif;
+
+$header-font-family: 'Iosevka Aile', sans-serif;
diff --git a/themes/mnemosyne/assets/style/main.sass b/themes/mnemosyne/assets/style/main.sass
new file mode 100644
index 0000000..e9a1c6e
--- /dev/null
+++ b/themes/mnemosyne/assets/style/main.sass
@@ -0,0 +1,195 @@
+@charset "utf-8"
+
+@import url('../font/iosevka-aile.css')
+@import url('../font/iosevka-etoile.css')
+@import url('../font/iosevka.css')
+
+@function make-light($c)
+ @return scale-color($c, $lightness: 30%, $saturation: -25%)
+
+@function make-lighter($c)
+ @return scale-color($c, $lightness: 60%, $saturation: -50%)
+
+$family-sans-serif: "Iosevka Aile Web", sans-serif
+$family-serif: "Iosevka Etoile Web", serif
+$family-monospace: "Iosevka Web", monospace
+
+$turquoise: #236863
+$blue: #2D4471
+$brown: #552500
+$turquoise-light: make-light($turquoise)
+$turquoise-lighter: make-lighter($turquoise)
+$blue-light: make-light($blue)
+$blue-lighter: make-lighter($blue)
+$brown-light: make-light($brown)
+$brown-lighter: make-lighter($brown)
+
+$family-primary: $family-serif
+
+$link: $turquoise
+
+
+@import '../../node_modules/bulma/bulma.sass'
+
+@import '_code.scss'
+
+body
+ font-size: 14px
+
+h1, h2, h3, h4, h5, h6
+ font-family: $family-sans-serif
+ color: $brown
+
+ &:before
+ color: $brown-lighter
+
+ a
+ color: inherit
+
+h1
+ font-size: $size-large
+
+ &:before
+ content: "# "
+
+h2, .content h2
+ font-size: $size-medium
+
+ &:before
+ content: "## "
+
+h3, .content h3
+ &:before
+ content: "### "
+
+h3, h4, h5, h6, .content h3, .content h4, .content h5, .content h6
+ font-size: $body-font-size
+
+h5, h6, .content h5, .content h6
+ font-style: italic
+
+h6, .content h6
+ font-weight: normal
+
+.content
+ strong:before, strong:after
+ content: "*"
+
+ em:before, em:after
+ content: "_"
+
+ a
+ text-decoration: underline
+
+ ul
+ *:marker
+ font-weight: bold
+
+ list-style-type: "* "
+ ul
+ list-style-type: "+ "
+ ul
+ list-style-type: "- "
+
+ +mobile
+ &.taxonomy-list.tags-list
+ column-count: 2
+ +tablet-only
+ &.taxonomy-list.tags-list
+ column-count: 3
+ +desktop
+ &.taxonomy-list.tags-list
+ column-count: 4
+
+.summary
+ @extend .hero
+ @extend .my-5
+ @extend .px-3
+ @extend .py-5
+
+.link-summary
+ @extend .has-background-link-light
+
+.note-summary
+ @extend .has-background-info-light
+
+.single, .list
+ @extend .my-5
+ @extend .px-3
+ @extend .py-5
+
+.site-title
+ @extend h1
+
+ padding-left: 0
+
+ &:before
+ content: none
+
+.site-description
+ background-color: $white-ter
+
+#webmentions
+ .comments
+ max-height: 20em
+ overflow-x: hidden
+ overflow-y: scroll
+ font-size: 80%
+
+ li
+ .text
+ color: #555
+ font-style: italic
+ text-decoration: none
+
+ .name
+ color: #111
+
+ h2
+ font-size: medium
+ margin: 0
+ padding: 0.5em
+
+ &:first-child
+ border-top-left-radius: 0.5em
+ border-top-right-radius: 0.5em
+
+ .reacts img
+ margin: 3px -1ex 1px 0
+ vertical-align: baseline
+
+ ul
+ list-style-type: none
+ margin: 0
+ padding: 4px
+
+ li
+ text-indent: -3em
+ padding-left: 3em
+ padding-bottom: 0.5em
+
+ a.reaction
+ position: relative
+
+ margin-right: 0
+ margin-right: 1ex
+
+ text-decoration: none
+ text-shadow: 0px 0px 3px white
+
+ img
+ max-height: 2em
+ margin-right: -1ex
+ border-radius: 3px
+
+ sub
+ font-size: 50%
+
+ .reacts a.reaction
+ display: inline-block
+
+ ul
+ @extend .menu-list
+
+#current
+ font-weight: bold
diff --git a/themes/mnemosyne/images/screenshot.png b/themes/mnemosyne/images/screenshot.png
new file mode 100644
index 0000000..106f7cf
Binary files /dev/null and b/themes/mnemosyne/images/screenshot.png differ
diff --git a/themes/mnemosyne/images/splash.png b/themes/mnemosyne/images/splash.png
new file mode 100644
index 0000000..23f7f54
Binary files /dev/null and b/themes/mnemosyne/images/splash.png differ
diff --git a/themes/mnemosyne/images/tn.png b/themes/mnemosyne/images/tn.png
new file mode 100644
index 0000000..3175dd8
Binary files /dev/null and b/themes/mnemosyne/images/tn.png differ
diff --git a/themes/mnemosyne/iosevka-build-plans.toml b/themes/mnemosyne/iosevka-build-plans.toml
new file mode 100644
index 0000000..444ddcf
--- /dev/null
+++ b/themes/mnemosyne/iosevka-build-plans.toml
@@ -0,0 +1,174 @@
+[buildPlans.iosevka-mnemosyne]
+family = "Iosevka"
+spacing = "fixed"
+serifs = "sans"
+no-cv-ss = true
+
+[buildPlans.iosevka-mnemosyne.weights.regular]
+shape = 400
+menu = 400
+css = 400
+
+[buildPlans.iosevka-mnemosyne.weights.bold]
+shape = 700
+menu = 700
+css = 700
+
+[buildPlans.iosevka-mnemosyne.slopes.upright]
+angle = 0
+shape = "upright"
+menu = "upright"
+css = "normal"
+
+[buildPlans.iosevka-mnemosyne.slopes.italic]
+angle = 9.4
+shape = "italic"
+menu = "italic"
+css = "italic"
+
+[buildPlans.iosevka-aile-mnemosyne]
+family = "Iosevka Aile"
+desc = "Sans-serif"
+spacing = "quasi-proportional"
+snapshotFamily = 'iosevka-aile'
+snapshotFeature = '"NWID" off'
+export-glyph-names = true
+
+[buildPlans.iosevka-aile-mnemosyne.variants.design]
+capital-i = "serifless"
+capital-j = "serifless"
+capital-k = "straight-serifless"
+capital-m = "flat-bottom"
+capital-w = "straight-flat-top"
+a = "double-storey-serifless"
+d = "toothed-serifless"
+e = "flat-crossbar"
+f = "flat-hook"
+g = "single-storey-serifless"
+i = "serifless"
+j = "flat-hook-serifless"
+k = "straight-serifless"
+l = "serifless"
+r = "compact"
+t = "flat-hook"
+u = "toothed"
+w = "straight-flat-top"
+y = "straight"
+long-s = "flat-hook"
+eszet = "longs-s-lig"
+lower-iota = "flat-tailed"
+lower-lambda = "straight-turn"
+cyrl-ef = "serifless"
+cyrl-capital-ka = "symmetric-connected-serifless"
+cyrl-ka = "symmetric-connected-serifless"
+cyrl-capital-u = "straight"
+at = "fourfold"
+percent = "rings-continuous-slash"
+
+# Letterform control for U+1D670 ... U+1D6A3
+[buildPlans.iosevka-aile-mnemosyne.derivingVariants.mathtt.design]
+capital-i = "serifed"
+capital-j = "serifless"
+capital-k = "straight-serifless"
+capital-m = "flat-bottom"
+capital-w = "straight-flat-top"
+a = "double-storey-serifless"
+d = "toothed-serifless"
+e = "flat-crossbar"
+f = "flat-hook"
+g = "single-storey-serifless"
+i = "serifed"
+j = "flat-hook-serifed"
+k = "straight-serifless"
+l = "serifed"
+r = "compact"
+t = "flat-hook"
+u = "toothed"
+w = "straight-flat-top"
+y = "straight"
+long-s = "flat-hook"
+eszet = "longs-s-lig"
+lower-iota = "flat-tailed"
+lower-lambda = "straight-turn"
+cyrl-ef = "serifless"
+cyrl-capital-ka = "symmetric-connected-serifless"
+cyrl-ka = "symmetric-connected-serifless"
+cyrl-capital-u = "straight"
+at = "fourfold"
+percent = "rings-continuous-slash"
+
+[buildPlans.iosevka-aile-mnemosyne.widths.normal]
+shape = 600
+menu = 5
+css = "normal"
+
+[buildPlans.iosevka-aile-mnemosyne.weights.regular]
+shape = 400
+menu = 400
+css = 400
+
+[buildPlans.iosevka-aile-mnemosyne.weights.bold]
+shape = 700
+menu = 700
+css = 700
+
+[buildPlans.iosevka-aile-mnemosyne.slopes.upright]
+angle = 0
+shape = "upright"
+menu = "upright"
+css = "normal"
+
+[buildPlans.iosevka-aile-mnemosyne.slopes.italic]
+angle = 9.4
+shape = "italic"
+menu = "italic"
+css = "italic"
+
+
+
+[buildPlans.iosevka-etoile-mnemosyne]
+family = "Iosevka Etoile"
+desc = "Slab-serif"
+spacing = "quasi-proportional"
+serifs = 'slab'
+snapshotFamily = 'iosevka-etoile'
+snapshotFeature = '"NWID" off'
+export-glyph-names = true
+
+[buildPlans.iosevka-etoile-mnemosyne.variants.design]
+at = 'fourfold'
+capital-w = 'straight-flat-top'
+f = "flat-hook-serifed"
+j = 'flat-hook-serifed'
+t = "flat-hook"
+w = 'straight-flat-top'
+
+[buildPlans.iosevka-etoile-mnemosyne.variants.italic]
+f = "flat-hook-tailed"
+
+[buildPlans.iosevka-etoile-mnemosyne.widths.normal]
+shape = 600
+menu = 5
+css = "normal"
+
+[buildPlans.iosevka-etoile-mnemosyne.weights.regular]
+shape = 400
+menu = 400
+css = 400
+
+[buildPlans.iosevka-etoile-mnemosyne.weights.bold]
+shape = 700
+menu = 700
+css = 700
+
+[buildPlans.iosevka-etoile-mnemosyne.slopes.upright]
+angle = 0
+shape = "upright"
+menu = "upright"
+css = "normal"
+
+[buildPlans.iosevka-etoile-mnemosyne.slopes.italic]
+angle = 9.4
+shape = "italic"
+menu = "italic"
+css = "italic"
diff --git a/themes/mnemosyne/layouts/404.html b/themes/mnemosyne/layouts/404.html
new file mode 100644
index 0000000..e807f40
--- /dev/null
+++ b/themes/mnemosyne/layouts/404.html
@@ -0,0 +1,26 @@
+{{ define "main" }}
+
+
+
+
+
+
+ Page not found
+
+
+
+
+
+
+
+
+{{ end }}
diff --git a/themes/mnemosyne/layouts/_default/baseof.html b/themes/mnemosyne/layouts/_default/baseof.html
new file mode 100644
index 0000000..d92eac3
--- /dev/null
+++ b/themes/mnemosyne/layouts/_default/baseof.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+ {{ .Title }}
+ {{ .Scratch.Set "desc" slice }}
+ {{ with .Site.Params.description }}{{ $.Scratch.Add "desc" (slice .) }}{{ end }}
+ {{ with .Site.Params.topics }}{{ $.Scratch.Add "desc" (slice (delimit . " & ")) }}{{ end }}
+ {{ if gt (len (.Scratch.Get "desc")) 0 }}
+
+ {{ end }}
+ {{ with .Site.Params.author }} {{ end }}
+ {{ $style := resources.Get "style/main.sass" | resources.ToCSS }}
+
+
+ {{ with .Site.Params.comments.webmention }} {{ end }}
+ {{ with .Site.Params.comments.pingback }} {{ end }}
+
+ {{ if .Site.Params.comments.cactus }} {{ end }}
+ {{ with .OutputFormats.Get "RSS" -}}
+ {{ printf ` ` .Rel .MediaType.Type .RelPermalink $.Site.Title | safeHTML }}
+ {{- end }}
+
+
+ {{ partial "header" . }}
+ {{ block "main" . }}{{ end }}
+ {{ partial "footer" . }}
+ {{ partial "scripts" . }}
+
+
diff --git a/themes/mnemosyne/layouts/_default/frag/metadata.html b/themes/mnemosyne/layouts/_default/frag/metadata.html
new file mode 100644
index 0000000..d65c6b3
--- /dev/null
+++ b/themes/mnemosyne/layouts/_default/frag/metadata.html
@@ -0,0 +1,7 @@
+{{ partial "status" . }}
+
+ Date:
+ {{ .Date.Format .Site.Params.DateFormat }}
+
+{{ partial "series.html" .Params.series }}
+{{ partial "tags.html" .Params.tags }}
diff --git a/themes/mnemosyne/layouts/_default/frag/summary-content.html b/themes/mnemosyne/layouts/_default/frag/summary-content.html
new file mode 100644
index 0000000..ceea0ba
--- /dev/null
+++ b/themes/mnemosyne/layouts/_default/frag/summary-content.html
@@ -0,0 +1,4 @@
+{{ .Summary }}
+{{ if .Truncated }}
+Read more...
+{{ end }}
diff --git a/themes/mnemosyne/layouts/_default/frag/title.html b/themes/mnemosyne/layouts/_default/frag/title.html
new file mode 100644
index 0000000..c31f971
--- /dev/null
+++ b/themes/mnemosyne/layouts/_default/frag/title.html
@@ -0,0 +1 @@
+[{{ .Type | upper }}] {{ .Title }}
diff --git a/themes/mnemosyne/layouts/_default/li.html b/themes/mnemosyne/layouts/_default/li.html
new file mode 100644
index 0000000..60d7742
--- /dev/null
+++ b/themes/mnemosyne/layouts/_default/li.html
@@ -0,0 +1,6 @@
+
+ {{ .Date.Format .Site.Params.DateFormat }}:
+
+ {{ .Title }}
+
+
diff --git a/themes/mnemosyne/layouts/_default/list.html b/themes/mnemosyne/layouts/_default/list.html
new file mode 100644
index 0000000..7537406
--- /dev/null
+++ b/themes/mnemosyne/layouts/_default/list.html
@@ -0,0 +1,25 @@
+{{ define "main" }}
+
+
+ {{ if or .Title .Content }}
+
+
+ {{ with .Title }}
{{ . }} {{ end }}
+ {{ with .Content }}
{{ . }}
{{ end }}
+
+
+ {{ end }}
+
+
+
+ {{ $sort_field := "Date" }}
+ {{ if eq .Kind "taxonomy" }}{{ $sort_field = "Title" }}{{ end }}
+ {{ range sort .Pages $sort_field "asc" }}
+ {{ .Render "li" }}
+ {{ end }}
+
+
+
+
+
+{{ end }}
diff --git a/themes/mnemosyne/layouts/_default/single.html b/themes/mnemosyne/layouts/_default/single.html
new file mode 100644
index 0000000..cdcf61e
--- /dev/null
+++ b/themes/mnemosyne/layouts/_default/single.html
@@ -0,0 +1,24 @@
+{{ define "main" }}
+
+
+
+
+
{{ .Render "frag/title" }}
+
+
+
+
+ {{ .Render "frag/metadata" }}
+
+
+ {{ partial "series-items" . }}
+ {{ partial "toc" . }}
+
+ {{ .Content }}
+
+
+
+ {{ partial "comments" . }}
+
+
+{{ end }}
diff --git a/themes/mnemosyne/layouts/_default/summary.html b/themes/mnemosyne/layouts/_default/summary.html
new file mode 100644
index 0000000..56a22dd
--- /dev/null
+++ b/themes/mnemosyne/layouts/_default/summary.html
@@ -0,0 +1,20 @@
+
+
+ {{ if ne .Type "note" }}
+
+ {{ end }}
+
+
+ {{ .Render "frag/metadata" }}
+
+
+ {{ .Render "frag/summary-content" }}
+
+
+
+
diff --git a/themes/mnemosyne/layouts/index.html b/themes/mnemosyne/layouts/index.html
new file mode 100644
index 0000000..7fa47e9
--- /dev/null
+++ b/themes/mnemosyne/layouts/index.html
@@ -0,0 +1,28 @@
+{{ define "main" }}
+
+
+
+
+
+ {{ with .Site.Params.Description }}{{.}}{{ end }}
+ {{ with .Site.Params.Topics }}
+ {{ $last := sub (len .) 1 }}
+ {{ range $i, $x := . }}
+
{{ $x }}
+ {{ if lt $i $last }}
& {{ end }}
+ {{ end }}
+ {{ end }}
+
+
+
+
+
+
+
+ {{ $paginator := .Paginate (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) }}
+ {{ range $paginator.Pages }}
+ {{ .Render "summary" }}
+ {{ end }}
+ {{ partial "pagination" . }}
+
+{{ end }}
diff --git a/themes/mnemosyne/layouts/link/frag/summary-content.html b/themes/mnemosyne/layouts/link/frag/summary-content.html
new file mode 100644
index 0000000..48caa58
--- /dev/null
+++ b/themes/mnemosyne/layouts/link/frag/summary-content.html
@@ -0,0 +1,4 @@
+{{ .Content }}
+
+ >>>
+
diff --git a/themes/mnemosyne/layouts/note/frag/summary-content.html b/themes/mnemosyne/layouts/note/frag/summary-content.html
new file mode 100644
index 0000000..68a09ae
--- /dev/null
+++ b/themes/mnemosyne/layouts/note/frag/summary-content.html
@@ -0,0 +1 @@
+{{ .Content }}
diff --git a/themes/mnemosyne/layouts/page/frag/metadata.html b/themes/mnemosyne/layouts/page/frag/metadata.html
new file mode 100644
index 0000000..0fef108
--- /dev/null
+++ b/themes/mnemosyne/layouts/page/frag/metadata.html
@@ -0,0 +1,2 @@
+{{ partial "status" . }}
+{{ partial "tags" .Params.tags }}
diff --git a/themes/mnemosyne/layouts/page/frag/title.html b/themes/mnemosyne/layouts/page/frag/title.html
new file mode 100644
index 0000000..dbae70d
--- /dev/null
+++ b/themes/mnemosyne/layouts/page/frag/title.html
@@ -0,0 +1 @@
+{{ .Title }}
diff --git a/themes/mnemosyne/layouts/partials/comments.html b/themes/mnemosyne/layouts/partials/comments.html
new file mode 100644
index 0000000..f6805df
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/comments.html
@@ -0,0 +1,13 @@
+
+
+
+ {{ partial "comments/webmention" . }}
+ {{ partial "comments/cactus" . }}
+ {{ with .Site.DisqusShortname }}
+
+ {{ template "_internal/disqus.html" . }}
+
+ {{ end }}
+
+
+
diff --git a/themes/mnemosyne/layouts/partials/comments/cactus.html b/themes/mnemosyne/layouts/partials/comments/cactus.html
new file mode 100644
index 0000000..70f0015
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/comments/cactus.html
@@ -0,0 +1,10 @@
+{{ if .Site.Params.comments.cactus }}
+
+
+
Comments
+
+
+
+ Powered by Cactus Comments 🌵
+
+{{ end }}
diff --git a/themes/mnemosyne/layouts/partials/comments/webmention.html b/themes/mnemosyne/layouts/partials/comments/webmention.html
new file mode 100644
index 0000000..ab5cc21
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/comments/webmention.html
@@ -0,0 +1,17 @@
+{{ if .Site.Params.comments.webmention }}
+
+
+
Webmentions
+
+ You can respond to this post, "{{ .Title }}" , by:
+ liking, boosting or replying to a tweet or toot that mentions it; or
+ sending a webmention from your own site to {{ .Permalink }}
+
+
+
+
+
+ Comments & reactions haven't loaded yet. You might have JavaScript disabled but that's cool 😎.
+
+
+{{ end }}
diff --git a/themes/mnemosyne/layouts/partials/footer.html b/themes/mnemosyne/layouts/partials/footer.html
new file mode 100644
index 0000000..ed22d06
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/footer.html
@@ -0,0 +1,26 @@
+
diff --git a/themes/mnemosyne/layouts/partials/header.html b/themes/mnemosyne/layouts/partials/header.html
new file mode 100644
index 0000000..bc42571
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/header.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+ {{- if .IsHome -}}
{{- else -}}{{- end -}}
+
+
+
+
+
+
+
+
+ {{ with .Site.Menus.main }}
+
+ {{ end }}
+
+
+
+
diff --git a/themes/mnemosyne/layouts/partials/pagination.html b/themes/mnemosyne/layouts/partials/pagination.html
new file mode 100644
index 0000000..db85b54
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/pagination.html
@@ -0,0 +1,11 @@
+
diff --git a/themes/mnemosyne/layouts/partials/scripts.html b/themes/mnemosyne/layouts/partials/scripts.html
new file mode 100644
index 0000000..af23403
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/scripts.html
@@ -0,0 +1,19 @@
+
+
+{{ if .File }}
+ {{ $page_id := .File.BaseFileName }}
+ {{ if .Site.Params.comments.webmention }}
+ {{ $webmention_js := resources.Get "js/webmention.js" | minify }}
+
+ {{ end }}
+ {{ with .Site.Params.comments.cactus }}
+
+ {{ end }}
+{{ end }}
diff --git a/themes/mnemosyne/layouts/partials/series-items.html b/themes/mnemosyne/layouts/partials/series-items.html
new file mode 100644
index 0000000..82b3a32
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/series-items.html
@@ -0,0 +1,27 @@
+{{ $page := . }}
+{{ with .Params.series }}
+ {{ $series := (site.GetPage "/series").GetPage . }}
+
+{{ end }}
diff --git a/themes/mnemosyne/layouts/partials/series.html b/themes/mnemosyne/layouts/partials/series.html
new file mode 100644
index 0000000..bf2be9b
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/series.html
@@ -0,0 +1,7 @@
+{{ with . }}
+ {{ $series := (site.GetPage "/series").GetPage . }}
+
+{{ end }}
diff --git a/themes/mnemosyne/layouts/partials/sidebar.html b/themes/mnemosyne/layouts/partials/sidebar.html
new file mode 100644
index 0000000..92bbd80
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/sidebar.html
@@ -0,0 +1,14 @@
+
+
+
+
LATEST POSTS
+
+
+
+ {{ range first 5 (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) }}
+ {{ .Title }}
+ {{ end }}
+
+
+
+
diff --git a/themes/mnemosyne/layouts/partials/social.html b/themes/mnemosyne/layouts/partials/social.html
new file mode 100644
index 0000000..a631cb4
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/social.html
@@ -0,0 +1,34 @@
+{{ with .Site.Params.Social }}
+
+ me elsewhere ::
+ {{ $last := sub (len .) 1 }}
+ {{ range $i, $x := . }}
+ {{ $url := $x.info }}
+ {{ $text := $x.kind }}
+ {{ if eq $x.kind "github" }}
+ {{ $url = printf "https://github.com/%s" $x.info }}
+ {{ else if eq $x.kind "gitlab" }}
+ {{ $url = printf "https://gitlab.com/%s" $x.info }}
+ {{ else if eq $x.kind "linkedin" }}
+ {{ $url = printf "https://linkedin.com/in/%s" $x.info }}
+ {{ else if eq $x.kind "twitter" }}
+ {{ $url = printf "https://twitter.com/%s" $x.info }}
+ {{ else if eq $x.kind "mastodon" }}
+ {{ $url = printf "https://%s/@%s" (index $x.info 1) (index $x.info 0) }}
+ {{ else if eq $x.kind "orcid" }}
+ {{ $url = printf "https://orcid.org/%s" $x.info }}
+ {{ else if eq $x.kind "keybase" }}
+ {{ $url = printf "https://keybase.io/%s" $x.info }}
+ {{ else if eq $x.kind "keyoxide" }}
+ {{ $url = printf "https://keyoxide.org/%s" $x.info }}
+ {{ else if eq $x.kind "matrix" }}
+ {{ $url = printf "https://matrix.to/#/%s" $x.info }}
+ {{ else if eq $x.kind "pypi" }}
+ {{ $url = printf "https://pypi.org/user/%s" $x.info }}
+ {{ end }}
+ {{$text}}
+ {{ if ne $i $last }}|{{ end }}
+ {{ end }}
+
+
+{{ end }}
diff --git a/themes/mnemosyne/layouts/partials/status.html b/themes/mnemosyne/layouts/partials/status.html
new file mode 100644
index 0000000..8d25836
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/status.html
@@ -0,0 +1 @@
+{{ if .Params.draft }}Status: DRAFT ✏️
{{ end }}
diff --git a/themes/mnemosyne/layouts/partials/tags.html b/themes/mnemosyne/layouts/partials/tags.html
new file mode 100644
index 0000000..94a77fd
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/tags.html
@@ -0,0 +1,8 @@
+
+
Tags:
+ {{ range . }}
+
[{{ . }}]
+ {{ else }}
+
None
+ {{ end }}
+
diff --git a/themes/mnemosyne/layouts/partials/toc.html b/themes/mnemosyne/layouts/partials/toc.html
new file mode 100644
index 0000000..b811de2
--- /dev/null
+++ b/themes/mnemosyne/layouts/partials/toc.html
@@ -0,0 +1,10 @@
+{{ if .Params.ShowTOC }}
+
+
+
+ {{ .TableOfContents }}
+
+
+{{ end }}
diff --git a/themes/mnemosyne/layouts/post/frag/title.html b/themes/mnemosyne/layouts/post/frag/title.html
new file mode 100644
index 0000000..dbae70d
--- /dev/null
+++ b/themes/mnemosyne/layouts/post/frag/title.html
@@ -0,0 +1 @@
+{{ .Title }}
diff --git a/themes/mnemosyne/layouts/series/li.html b/themes/mnemosyne/layouts/series/li.html
new file mode 100644
index 0000000..c4873b1
--- /dev/null
+++ b/themes/mnemosyne/layouts/series/li.html
@@ -0,0 +1,4 @@
+
+ {{ .Title }} ({{ .Data.series | len }} posts)
+ {{- with .Params.summary }}: {{.}}{{ end }}
+
diff --git a/themes/mnemosyne/layouts/shortcodes/admonition.html b/themes/mnemosyne/layouts/shortcodes/admonition.html
new file mode 100644
index 0000000..511ef65
--- /dev/null
+++ b/themes/mnemosyne/layouts/shortcodes/admonition.html
@@ -0,0 +1,10 @@
+
+
+
+ {{ .Inner | markdownify }}
+
+
diff --git a/themes/mnemosyne/layouts/tags/li.html b/themes/mnemosyne/layouts/tags/li.html
new file mode 100644
index 0000000..5ede641
--- /dev/null
+++ b/themes/mnemosyne/layouts/tags/li.html
@@ -0,0 +1,5 @@
+
+
+ {{ .Title }}
+
+
diff --git a/themes/mnemosyne/package.json b/themes/mnemosyne/package.json
new file mode 100644
index 0000000..fc18e67
--- /dev/null
+++ b/themes/mnemosyne/package.json
@@ -0,0 +1,5 @@
+{
+ "dependencies": {
+ "bulma": "^0.9.2"
+ }
+}
diff --git a/themes/mnemosyne/static/css/style.css b/themes/mnemosyne/static/css/style.css
new file mode 100644
index 0000000..e69de29
diff --git a/themes/mnemosyne/static/font/iosevka-aile.css b/themes/mnemosyne/static/font/iosevka-aile.css
new file mode 100644
index 0000000..92009fb
--- /dev/null
+++ b/themes/mnemosyne/static/font/iosevka-aile.css
@@ -0,0 +1,36 @@
+
+@font-face {
+ font-family: 'Iosevka Aile Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('woff2/iosevka-aile-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-regular.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Aile Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('woff2/iosevka-aile-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-italic.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Aile Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('woff2/iosevka-aile-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-bold.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Aile Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('woff2/iosevka-aile-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-bolditalic.ttf') format('truetype');
+}
diff --git a/themes/mnemosyne/static/font/iosevka-etoile.css b/themes/mnemosyne/static/font/iosevka-etoile.css
new file mode 100644
index 0000000..fdc62d2
--- /dev/null
+++ b/themes/mnemosyne/static/font/iosevka-etoile.css
@@ -0,0 +1,36 @@
+
+@font-face {
+ font-family: 'Iosevka Etoile Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('woff2/iosevka-etoile-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-regular.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Etoile Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('woff2/iosevka-etoile-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-italic.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Etoile Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('woff2/iosevka-etoile-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-bold.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Etoile Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('woff2/iosevka-etoile-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-bolditalic.ttf') format('truetype');
+}
diff --git a/themes/mnemosyne/static/font/iosevka.css b/themes/mnemosyne/static/font/iosevka.css
new file mode 100644
index 0000000..2546386
--- /dev/null
+++ b/themes/mnemosyne/static/font/iosevka.css
@@ -0,0 +1,72 @@
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('woff2/iosevka-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-regular.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: expanded;
+ font-style: normal;
+ src: url('woff2/iosevka-mnemosyne-extended.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extended.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('woff2/iosevka-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-italic.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: expanded;
+ font-style: italic;
+ src: url('woff2/iosevka-mnemosyne-extendeditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendeditalic.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('woff2/iosevka-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-bold.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: expanded;
+ font-style: normal;
+ src: url('woff2/iosevka-mnemosyne-extendedbold.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendedbold.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('woff2/iosevka-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-bolditalic.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: expanded;
+ font-style: italic;
+ src: url('woff2/iosevka-mnemosyne-extendedbolditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendedbolditalic.ttf') format('truetype');
+}
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-bold.ttf b/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-bold.ttf
new file mode 100644
index 0000000..93b132d
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-bold.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-bolditalic.ttf b/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-bolditalic.ttf
new file mode 100644
index 0000000..dfa4bcf
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-bolditalic.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-italic.ttf b/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-italic.ttf
new file mode 100644
index 0000000..b35ae59
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-italic.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-regular.ttf b/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-regular.ttf
new file mode 100644
index 0000000..0061fef
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-aile-mnemosyne-regular.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-bold.ttf b/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-bold.ttf
new file mode 100644
index 0000000..be5969c
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-bold.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-bolditalic.ttf b/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-bolditalic.ttf
new file mode 100644
index 0000000..1e85e3e
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-bolditalic.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-italic.ttf b/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-italic.ttf
new file mode 100644
index 0000000..00ec8f4
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-italic.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-regular.ttf b/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-regular.ttf
new file mode 100644
index 0000000..93affdf
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-etoile-mnemosyne-regular.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-bold.ttf b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-bold.ttf
new file mode 100644
index 0000000..6ec8d60
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-bold.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-bolditalic.ttf b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-bolditalic.ttf
new file mode 100644
index 0000000..c4a7d21
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-bolditalic.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extended.ttf b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extended.ttf
new file mode 100644
index 0000000..93282b8
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extended.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extendedbold.ttf b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extendedbold.ttf
new file mode 100644
index 0000000..1c3b239
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extendedbold.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extendedbolditalic.ttf b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extendedbolditalic.ttf
new file mode 100644
index 0000000..afed6dc
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extendedbolditalic.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extendeditalic.ttf b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extendeditalic.ttf
new file mode 100644
index 0000000..b346d0b
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-extendeditalic.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-italic.ttf b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-italic.ttf
new file mode 100644
index 0000000..506a0f9
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-italic.ttf differ
diff --git a/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-regular.ttf b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-regular.ttf
new file mode 100644
index 0000000..94c2c0a
Binary files /dev/null and b/themes/mnemosyne/static/font/ttf/iosevka-mnemosyne-regular.ttf differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-bold.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-bold.woff2
new file mode 100644
index 0000000..84dbab2
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-bold.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-bolditalic.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-bolditalic.woff2
new file mode 100644
index 0000000..3ca335f
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-bolditalic.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-italic.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-italic.woff2
new file mode 100644
index 0000000..c82b678
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-italic.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-regular.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-regular.woff2
new file mode 100644
index 0000000..efa219f
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-aile-mnemosyne-regular.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-bold.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-bold.woff2
new file mode 100644
index 0000000..b8297d3
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-bold.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-bolditalic.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-bolditalic.woff2
new file mode 100644
index 0000000..bbaa985
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-bolditalic.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-italic.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-italic.woff2
new file mode 100644
index 0000000..ea3f423
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-italic.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-regular.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-regular.woff2
new file mode 100644
index 0000000..6900e09
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-etoile-mnemosyne-regular.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-bold.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-bold.woff2
new file mode 100644
index 0000000..2d8a8f1
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-bold.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-bolditalic.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-bolditalic.woff2
new file mode 100644
index 0000000..9040fee
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-bolditalic.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extended.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extended.woff2
new file mode 100644
index 0000000..a3ea1e0
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extended.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extendedbold.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extendedbold.woff2
new file mode 100644
index 0000000..a3a54d9
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extendedbold.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extendedbolditalic.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extendedbolditalic.woff2
new file mode 100644
index 0000000..1a62970
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extendedbolditalic.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extendeditalic.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extendeditalic.woff2
new file mode 100644
index 0000000..f7e09f2
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-extendeditalic.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-italic.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-italic.woff2
new file mode 100644
index 0000000..9374115
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-italic.woff2 differ
diff --git a/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-regular.woff2 b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-regular.woff2
new file mode 100644
index 0000000..123c070
Binary files /dev/null and b/themes/mnemosyne/static/font/woff2/iosevka-mnemosyne-regular.woff2 differ
diff --git a/themes/mnemosyne/static/js/navbar.js b/themes/mnemosyne/static/js/navbar.js
new file mode 100644
index 0000000..4ad91c9
--- /dev/null
+++ b/themes/mnemosyne/static/js/navbar.js
@@ -0,0 +1,25 @@
+document.addEventListener('DOMContentLoaded', () => {
+
+ // Get all "navbar-burger" elements
+ const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
+
+ // Check if there are any navbar burgers
+ if ($navbarBurgers.length > 0) {
+
+ // Add a click event on each of them
+ $navbarBurgers.forEach( el => {
+ el.addEventListener('click', () => {
+
+ // Get the target from the "data-target" attribute
+ const target = el.dataset.target;
+ const $target = document.getElementById(target);
+
+ // Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
+ el.classList.toggle('is-active');
+ $target.classList.toggle('is-active');
+
+ });
+ });
+ }
+
+});
diff --git a/themes/mnemosyne/theme.toml b/themes/mnemosyne/theme.toml
new file mode 100644
index 0000000..9e56685
--- /dev/null
+++ b/themes/mnemosyne/theme.toml
@@ -0,0 +1,12 @@
+name = "Blank"
+license = "MIT"
+licenselink = "https://github.com/vimux/blank/blob/master/LICENSE"
+description = "Starter Hugo theme for developers."
+homepage = "https://github.com/vimux/blank/"
+tags = ["blog", "plain", "blank", "starter", "development"]
+features = ["blog"]
+min_version = "0.20"
+
+[author]
+ name = "Vimux"
+ homepage = "https://github.com/vimux"
diff --git a/themes/mnemosyne/yarn.lock b/themes/mnemosyne/yarn.lock
new file mode 100644
index 0000000..4300454
--- /dev/null
+++ b/themes/mnemosyne/yarn.lock
@@ -0,0 +1,8 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+bulma@^0.9.2:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.9.2.tgz#340011e119c605f19b8ca886bfea595f1deaf23c"
+ integrity sha512-e14EF+3VSZ488yL/lJH0tR8mFWiEQVCMi/BQUMi2TGMBOk+zrDg4wryuwm/+dRSHJw0gMawp2tsW7X1JYUCE3A==