This commit is contained in:
Waffelo 2025-04-24 21:30:21 +02:00
parent b978f47d67
commit 992633b240
33 changed files with 738 additions and 1 deletions

@ -1 +0,0 @@
Subproject commit 4739bdb60036bd783ebd04fbf5151ab6346a63c9

2
themes/plague/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
.DS_Store
.hugo_build.lock

View file

@ -0,0 +1,2 @@
+++
+++

View file

@ -0,0 +1,4 @@
[module]
[module.hugoVersion]
extended = false
min = "0.110.0"

3
themes/plague/go.mod Normal file
View file

@ -0,0 +1,3 @@
module github.com/brianreumere/plague
go 1.21.4

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
themes/plague/images/tn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

View file

@ -0,0 +1,4 @@
{{ define "main" }}
<h1 class="http-error">404 Error</h1>
<p class="http-error">That page wasn't found. <a href="{{ .Site.BaseURL }}">Go home</a>?</p>
{{ end }}

View file

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="{{ .Site.Language.Lang }}">
{{ partial "head.html" . }}
<body>
<div class="site-content">
<header>
{{ partial "header.html" . }}
</header>
<main class="content">
{{ block "main" . }}{{ end }}
</main>
<footer>
{{- partial "footer.html" . -}}
</footer>
</div>
</body>
</html>

View file

@ -0,0 +1,27 @@
{{ define "main" }}
{{ range .Paginator.Pages }}
<!-- Tags -->
{{range $name, $taxonomy := .Site.Taxonomies.tags}} {{ $cnt := .Count }}
{{ with $.Site.GetPage (printf "/tags/%s" $name) }}
<div class="tagbutton">
<a href={{ .RelPermalink }} style="text-decoration: none; color: var(--text-color);" title="All pages with tag <i>{{$name}}</i>"><code>{{$name}} ({{$cnt}})</code></a>
</div>
{{end}}
{{end}}
<br>
<!-- Posts -->
<h2>Posts</h2>
<p>
<span class="post-date"><time class="dt-published" datetime="{{ .Date.Format "2006-01-02T15:04:05Z07:00" | safeHTML }}">[{{ .Date | time.Format ":date_long" }}]</time></span> -
<a href="{{ .RelPermalink }}">{{ .Title }}</a><br>
</p>
{{ end }}
{{ with .OutputFormats.Get "rss" -}}
<p>
<a href="{{ .Permalink }}"><img alt="RSS feed icon" src="{{ "icons/rss.png" | absURL }}"></a>
</p>
{{ end }}
{{ end }}

View file

@ -0,0 +1,72 @@
{{- /* Deprecate site.Author.email in favor of site.Params.author.email */}}
{{- $authorEmail := "" }}
{{- with site.Params.author }}
{{- if reflect.IsMap . }}
{{- with .email }}
{{- $authorEmail = . }}
{{- end }}
{{- end }}
{{- else }}
{{- with site.Author.email }}
{{- $authorEmail = . }}
{{- warnf "The author key in site configuration is deprecated. Use params.author.email instead." }}
{{- end }}
{{- end }}
{{- /* Deprecate site.Author.name in favor of site.Params.author.name */}}
{{- $authorName := "" }}
{{- with site.Params.author }}
{{- if reflect.IsMap . }}
{{- with .name }}
{{- $authorName = . }}
{{- end }}
{{- else }}
{{- $authorName = . }}
{{- end }}
{{- else }}
{{- with site.Author.name }}
{{- $authorName = . }}
{{- warnf "The author key in site configuration is deprecated. Use params.author.name instead." }}
{{- end }}
{{- end }}
{{- $pctx := . }}
{{- if .IsHome }}{{ $pctx = .Site }}{{ end }}
{{- $pages := slice }}
{{- if or $.IsHome $.IsSection }}
{{- $pages = $pctx.RegularPages }}
{{- else }}
{{- $pages = $pctx.Pages }}
{{- end }}
{{- $limit := .Site.Config.Services.RSS.Limit }}
{{- if ge $limit 1 }}
{{- $pages = $pages | first $limit }}
{{- end }}
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>{{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ .Site.Title }}{{ end }}</title>
<link>{{ .Permalink }}</link>
<description>Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ .Site.Title }}</description>
<generator>Hugo {{ hugo.Version }}</generator>
<language>{{ site.Language.LanguageCode }}</language>{{ with $authorEmail }}
<managingEditor>{{.}}{{ with $authorName }} ({{ . }}){{ end }}</managingEditor>{{ end }}{{ with $authorEmail }}
<webMaster>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</webMaster>{{ end }}{{ with .Site.Copyright }}
<copyright>{{ . }}</copyright>{{ end }}{{ if not .Date.IsZero }}
<lastBuildDate>{{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
{{- with .OutputFormats.Get "RSS" }}
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
{{- end }}
{{- range $pages }}
<item>
<title>{{ .Title }}</title>
<link>{{ .Permalink }}</link>
<pubDate>{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
{{- with $authorEmail }}<author>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</author>{{ end }}
<guid>{{ .Permalink }}</guid>
<description>{{ .Content | transform.XMLEscape | safeHTML }}</description>
</item>
{{- end }}
</channel>
</rss>

View file

@ -0,0 +1,20 @@
{{ define "main" }}
<article class="h-entry">
<div class="post-metadata">
<h1 class="post-title p-name"><span style="color: grey;">#</span> {{ .Title }}</h1>
<hr>
<p class="post-date">
<span class="post-date">
Published on
<a class="u-url" href="{{ .Permalink }}"><time class="dt-published" datetime="{{ .Date.Format "2006-01-02T15:04:05Z07:00" | safeHTML }}">{{ .Date | time.Format ":date_long" }}</time></a>
by {{ with .Site.Params.Hcard.Avatar }}<img class="u-photo" alt="" src="{{ . | absURL }}"> {{ end }}<a class="p-author h-card" rel="author" href="{{ .Site.BaseURL }}">{{ .Site.Params.Hcard.FullName }}</a>
</span>
<b>Tags:</b>{{ with .Params.tags }}<!--<p>-->{{ range $i, $tag := . }}<code><a href="{{ "/tags/" | relLangURL }}{{ $tag | urlize }}">{{ $tag }}</a></code>{{ if lt (add $i 1) (len .) }} {{ end }}{{ end }}<!--</p>-->{{ end }}
</p>
</div>
<div class="post-content e-content">
{{.Content}}
</div>
</article>
{{ end }}

View file

@ -0,0 +1,3 @@
{{ define "main" }}
{{.Content}}
{{ end }}

View file

@ -0,0 +1,3 @@
{{ define "main" }}
{{.Content}}
{{ end }}

View file

@ -0,0 +1,15 @@
<div class="footer-container">
<!-- <div class="h-card bio">
{{- partial "hcard.html" . -}}
</div>-->
{{- with .Site.Params.SiteFooterText -}}
<div class="footer-text footer-right">
<p>
{{ . | markdownify }}
</p>
</div>
{{- end -}}
</div>
<div class="h-card social">
<!-- {{ partial "social.html" . -}} -->
</div>

View file

@ -0,0 +1,27 @@
<!-- Default h-card -->
<p>
<a class="u-url" href="{{ .Site.BaseURL }}">{{ .Site.Title }}</a>
created by {{ with .Site.Params.Hcard.Avatar }}<img class="u-photo" alt="" src="{{ . | absURL }}"> {{ end }}<span class="p-name" rel="me">{{ .Site.Params.Hcard.FullName }}</span>
{{- with .Site.Params.Hcard.Pronouns -}}
{{- $len_pronouns := (len .) }}
({{ range $index, $element := . }}<span class="u-pronoun">{{ $element }}</span>
{{- if eq (add $index 1) $len_pronouns -}}
{{- else -}}
/
{{- end -}}
{{- end }} pronouns
{{- end -}}
{{- if isset .Site.Params.Hcard "nickname" -}}
{{- with .Site.Params.Hcard.Pronouns }}, {{ else }}({{ end -}}
also known as <span class="p-nickname">{{ .Site.Params.Hcard.Nickname }}</span>)
{{- end -}}
{{- if not .Site.Params.Hcard.ShowLocation }}.{{ end -}}
{{- if .Site.Params.Hcard.ShowLocation }} in
{{ with .Site.Params.Hcard.City }} <span class="p-locality">{{ . }}</span>,{{ end }}
{{ with .Site.Params.Hcard.Region }} <span class="p-region">{{ . }}</span>,{{ end }}
{{ with .Site.Params.Hcard.Country }} <span class="p-country-name">{{ . }}</span>{{ end }}.
{{ end }}
</p>
{{ with .Site.Params.Hcard.Biography }}<p>
<span class="p-note">{{ . | markdownify }}</span>
</p>{{ end }}

View file

@ -0,0 +1,18 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{{ hugo.Generator }}
<title>{{ block "title" . }}{{ .Site.Title }}{{ end }}</title>
{{- with .Site.Params.Colors -}}
<link rel="stylesheet" href="{{ (printf "css/colors-%s.css" .) | absURL }}">
{{- else -}}
<link rel="stylesheet" href="{{ "css/colors-default-dark.css" | absURL }}">
{{ end }}
<link rel="stylesheet" href="{{ "css/style.css" | absURL }}">
{{- with .Site.Params.CustomStylesheet -}}
<link rel="stylesheet" href="{{ . | absURL }}">
{{ end }}
{{ with .OutputFormats.Get "rss" -}}
{{ printf `<link rel=%q type=%q href=%q title=%q>` .Rel .MediaType.Type .Permalink site.Title | safeHTML }}
{{ end }}
</head>

View file

@ -0,0 +1,14 @@
<div class="header-container">
<div class="site-header">
<a class="site-header" href="{{ .Site.BaseURL }}" style="border-bottom: gray dashed 3px;">{{ .Site.Params.siteHeaderText }}</a>
</div>
<div class="site-nav">
<nav aria-label="Site menu" class="site-nav">
{{- $currentPage := . -}}
{{- range $index, $element := .Site.Menus.main -}}
{{- $len_nav_items := (len $.Site.Menus.main) -}}
<a class="nav-item{{ if or ($currentPage.IsMenuCurrent "main" .) ($currentPage.HasMenuCurrent "main" .) }} active{{ end }}{{ if eq $index 0 }} first{{ end }}{{ if eq (add $index 1) $len_nav_items }} last{{ end }}" href="{{ .URL }}">[{{ .Name }}]</a>
{{- end }}
</nav>
</div>
</div>

View file

@ -0,0 +1,3 @@
{{- range .Site.Params.Hcard.Social -}}
<a class="u-url" rel="me" aria-label="{{ .platform }}" href="{{ (printf .url_pattern .identity) }}"><span class="social-icon" >{{ partial "svg-icon.html" .platform }}</span></a>
{{ end -}}

View file

@ -0,0 +1,5 @@
{{- $filename := (printf "icons/%s.svg" .) -}}
{{- $svg_old := "<svg" -}}
{{- $svg_new := "<svg aria-hidden=\"true\"" }}
{{- $fill := replace (readFile $filename) $svg_old $svg_new -}}
{{- $fill | safeHTML -}}

View file

@ -0,0 +1 @@
<p role="note" class="callout">{{ .Inner | markdownify }}</p>

View file

@ -0,0 +1 @@
<span class="inline-icon">{{ partial "svg-icon.html" (.Get 0) }}</span>

View file

@ -0,0 +1,22 @@
:root {
--background-color: #1b1919;
--text-color: #cdcdcd;
--light-text-color: #dfdfdf;
--hr-color: grey;
--link-color: #a3b8f5;
--active-link-color: #f9f9f9;
--nav-item-link-color: #a3b8f5;
--nav-item-active-color: #a3b8f5;
--selection-highlight-color: #305ee8;
--preformatted-background-color: #2f2d2d;
--preformatted-text-color: #f9f9f9;
--callout-background-color: #2445a8;
--callout-text-color: #f9f9f9;
--callout-link-color: #e8eefd;
--callout-highlight-color: #bac9f7;
--blockquote-background-color: #2f2d2d;
--blockquote-text-color: #ffffff;
--blockquote-link-color: #ffffff;
--blockquote-highlight-color: #dfdfdf;
--social-icon-color: #a3b8f5;
}

View file

@ -0,0 +1,22 @@
:root {
--background-color: #f9f9f9;
--text-color: #141414;
--light-text-color: #545454;
--hr-color: #1745cf;
--link-color: #1745cf;
--active-link-color: #141414;
--nav-item-link-color: #1745cf;
--nav-item-active-color: #1745cf;
--selection-highlight-color: #5e82ed;
--preformatted-background-color: #3c3c3c;
--preformatted-text-color: #f9f9f9;
--callout-background-color: #bac9f7;
--callout-text-color: #141414;
--callout-link-color: #102f8e;
--callout-highlight-color: #1745cf;
--blockquote-background-color: #dfdfdf;
--blockquote-text-color: #000000;
--blockquote-link-color: #000000;
--blockquote-highlight-color: #444444;
--social-icon-color: #1745cf;
}

View file

@ -0,0 +1,49 @@
@media (prefers-color-scheme: light) {
:root {
--background-color: #f9f9f9;
--text-color: #141414;
--light-text-color: #545454;
--hr-color: #1745cf;
--link-color: #1745cf;
--active-link-color: #141414;
--nav-item-link-color: #1745cf;
--nav-item-active-color: #1745cf;
--selection-highlight-color: #5e82ed;
--preformatted-background-color: #3c3c3c;
--preformatted-text-color: #f9f9f9;
--callout-background-color: #bac9f7;
--callout-text-color: #141414;
--callout-link-color: #102f8e;
--callout-highlight-color: #1745cf;
--blockquote-background-color: #dfdfdf;
--blockquote-text-color: #000000;
--blockquote-link-color: #000000;
--blockquote-highlight-color: #444444;
--social-icon-color: #1745cf;
}
}
@media (prefers-color-scheme: dark) {
:root {
--background-color: #202020;
--text-color: #f9f9f9;
--light-text-color: #dfdfdf;
--hr-color: #a3b8f5;
--link-color: #a3b8f5;
--active-link-color: #f9f9f9;
--nav-item-link-color: #a3b8f5;
--nav-item-active-color: #a3b8f5;
--selection-highlight-color: #305ee8;
--preformatted-background-color: #3c3c3c;
--preformatted-text-color: #f9f9f9;
--callout-background-color: #2445a8;
--callout-text-color: #f9f9f9;
--callout-link-color: #e8eefd;
--callout-highlight-color: #bac9f7;
--blockquote-background-color: #595959;
--blockquote-text-color: #ffffff;
--blockquote-link-color: #ffffff;
--blockquote-highlight-color: #dfdfdf;
--social-icon-color: #a3b8f5;
}
}

View file

@ -0,0 +1,22 @@
:root {
--background-color: #141414;
--text-color: #e7e7e7;
--light-text-color: #cccccc;
--hr-color: #40bfa2;
--link-color: #aa90f9;
--active-link-color: #e7e7e7;
--nav-item-link-color: #40bfa2;
--nav-item-active-color: #40bfa2;
--selection-highlight-color: #70dbc4;
--preformatted-background-color: #333333;
--preformatted-text-color: #70dbc4;
--callout-background-color: #3d3e94;
--callout-text-color: #ffffff;
--callout-link-color: #e9e3fc;
--callout-highlight-color: #aa90f9;
--blockquote-background-color: #555555;
--blockquote-text-color: #fafafa;
--blockquote-link-color: #fafafa;
--blockquote-highlight-color: #40bfa2;
--social-icon-color: #70dbc4;
}

View file

@ -0,0 +1,22 @@
:root {
--background-color: #fff9ec;
--text-color: #141414;
--light-text-color: #545454;
--hr-color: #206051;
--link-color: #4b0fff;
--active-link-color: #141414;
--nav-item-link-color: #206051;
--nav-item-active-color: #206051;
--selection-highlight-color: #70dbc4;
--preformatted-background-color: #333333;
--preformatted-text-color: #70dbc4;
--callout-background-color: #9697e9;
--callout-text-color: #000000;
--callout-link-color: #120047;
--callout-highlight-color: #460df2;
--blockquote-background-color: #dddddd;
--blockquote-text-color: #0a0a0a;
--blockquote-link-color: #0a0a0a;
--blockquote-highlight-color: #2dd2ac;
--social-icon-color: #206051;
}

View file

@ -0,0 +1,49 @@
@media (prefers-color-scheme: light) {
:root {
--background-color: #fff9ec;
--text-color: #141414;
--light-text-color: #545454;
--hr-color: #206051;
--link-color: #4b0fff;
--active-link-color: #141414;
--nav-item-link-color: #206051;
--nav-item-active-color: #206051;
--selection-highlight-color: #70dbc4;
--preformatted-background-color: #333333;
--preformatted-text-color: #70dbc4;
--callout-background-color: #9697e9;
--callout-text-color: #000000;
--callout-link-color: #120047;
--callout-highlight-color: #460df2;
--blockquote-background-color: #dddddd;
--blockquote-text-color: #0a0a0a;
--blockquote-link-color: #0a0a0a;
--blockquote-highlight-color: #2dd2ac;
--social-icon-color: #206051;
}
}
@media (prefers-color-scheme: dark) {
:root {
--background-color: #141414;
--text-color: #e7e7e7;
--light-text-color: #cccccc;
--hr-color: #40bfa2;
--link-color: #aa90f9;
--active-link-color: #e7e7e7;
--nav-item-link-color: #40bfa2;
--nav-item-active-color: #40bfa2;
--selection-highlight-color: #70dbc4;
--preformatted-background-color: #333333;
--preformatted-text-color: #70dbc4;
--callout-background-color: #3d3e94;
--callout-text-color: #ffffff;
--callout-link-color: #e9e3fc;
--callout-highlight-color: #aa90f9;
--blockquote-background-color: #555555;
--blockquote-text-color: #fafafa;
--blockquote-link-color: #fafafa;
--blockquote-highlight-color: #40bfa2;
--social-icon-color: #70dbc4;
}
}

View file

@ -0,0 +1,298 @@
.site-content {
display: flex;
flex-direction: column;
min-height: 100vh;
max-width: 740px;
margin-right: auto;
margin-left: auto;
margin-top: 0;
margin-bottom: 0;
padding-right: 30px;
padding-left: 30px;
}
body {
background: var(--background-color);
color: var(--text-color);
font-family: monospace;
font-size: 14px;
line-height: 1.5;
margin: 0px;
padding: 0px;
}
h1, h2, h3, h4, h5, h6 {
font-weight: 400;
margin-top: 0;
margin-bottom: 0;
}
h1 {
font-size: 2.625em;
line-height: 1;
letter-spacing: -1px;
}
main {
display: block;
}
p {
margin-bottom: 15px;
}
a {
text-decoration: underline;
color: var(--link-color);
}
a:active {
color: var(--active-link-color);
}
code {
padding: 5px;
margin: 5px;
background-color: var(--preformatted-background-color);
}
.site-header {
font-size: 26px;
font-weight: 300;
line-height: 54px;
letter-spacing: -1px;
width: 100%;
}
.site-header, .site-header:visited, .site-header:hover {
color: var(--text-color);
text-decoration: none;
}
.header-container {
margin-top: 20px;
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.site-nav {
overflow: auto;
text-align: left;
line-height: 54px;
width: 100%;
}
.site-nav .nav-item {
color: var(--nav-item-link-color);
text-decoration: none;
padding: 0px;
margin-top: 0px;
margin-bottom: 0px;
margin-left: 10px;
margin-right: 10px;
padding-top: 10px;
padding-bottom: 10px;
padding-left: 0px;
padding-right: 0px;
}
.nav-item.first {
margin-left: 0px;
}
.nav-item.last {
margin-right: 0px;
}
.nav-item.active {
border-bottom: 2px solid var(--nav-item-active-color);
}
@media screen and (min-width: 800px) {
div.site-header {
width: 300px;
padding-right: 15px;
}
div.site-nav {
width: 410px;
padding-left: 15px;
}
nav.site-nav {
text-align: right;
}
}
a.nav-item:hover {
text-decoration: none;
}
.content {
padding-top: 30px;
padding-bottom: 30px;
clear: both;
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0%;
}
.post-date {
color: var(--light-text-color);
font-size: 14px;
}
.http-error {
text-align: center;
}
pre, code {
font-family: 'SF Mono', 'Consolas', monospace;
font-size: 14px;
}
pre {
padding: 10px;
background-color: var(--preformatted-background-color);
color: var(--preformatted-text-color);
overflow-x: auto;
border-radius: 5px;
border: 2px dashed gray;
}
blockquote {
color: var(--blockquote-text-color);
background-color: var(--blockquote-background-color);
border-left: 10px solid var(--blockquote-highlight-color);
border-radius: 5px;
font-size: 14px;
margin-left: 40px;
margin-right: 140px;
}
blockquote p {
margin: 0px;
padding: 10px;
}
blockquote footer {
margin: 0px;
padding: 10px;
}
blockquote a {
color: var(--blockquote-link-color);
}
p.callout {
color: var(--callout-text-color);
background-color: var(--callout-background-color);
border-left: 10px solid var(--callout-highlight-color);
border-radius: 5px;
padding: 10px;
padding-left: 15px;
padding-right: 10px;
margin-left: 20px;
margin-right: 20px;
font-size: 14px;
}
.callout a {
color: var(--callout-link-color);
}
hr {
border: 1px dashed var(--hr-color);
border-radius: 1px;
margin-left: 0px;
margin-top: 20px;
margin-bottom: 20px;
width: 70%;
}
.footer-container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin-bottom: 15px;
color: var(--light-text-color);
font-size: 14px;
}
.footer-container p {
margin-top: 10px;
margin-bottom: 10px
}
.h-card.bio {
width: 100%;
}
.footer-right {
width: 100%;
}
@media screen and (min-width: 800px) {
.h-card.bio {
width: 355px;
padding-right: 15px;
margin-bottom: 1em;
}
.footer-right {
width: 355px;
padding-left: 15px;
margin-bottom: 1em;
}
}
img.u-photo {
vertical-align: bottom;
height: 1.5em;
border-radius: 25%;
}
.h-card.social {
margin-top: 1em;
margin-bottom: 2em;
text-align: center;
}
.social-icon {
display: inline-block;
padding-left: 10px;
padding-right: 10px;
height: 24px;
width: 24px;
}
.social-icon path {
fill: var(--social-icon-color);
}
.inline-icon {
display: inline-block;
height: 1em;
width: 1em;
position: relative;
top: 0.125em;
}
.inline-icon path {
fill: var(--text-color);
}
img[src$='#floatleft']
{
float:left
margin: 20px;
max-width: 40%;
//etc. etc/
}
img[src$='#floatright']
{
float:right;
margin: 20px;
max-width: 40%;
//etc. etc.
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

13
themes/plague/theme.toml Normal file
View file

@ -0,0 +1,13 @@
name = "plague"
license = "MIT"
licenselink = "https://github.com/brianreumere/plague/blob/main/LICENSE"
description = "A minimal Hugo theme with microformats"
homepage = "https://github.com/brianreumere/plague"
demosite = "https://brianreumere.github.io/plague-demo-site/"
tags = ["blog", "minimal"]
features = ["blog"]
min_version = "0.41.0"
[author]
name = "Brian Reumere"
homepage = "https://mutualaid.info"