Compare commits

27 Commits

Author SHA1 Message Date
677bf18e5b New style initial 2026-06-28 20:18:03 -05:00
9938f0f8ff Content Updates 2026-05-29 13:47:30 -05:00
36d0305af1 Content updates 2026-05-29 13:47:17 -05:00
c28f4fdb77 Bugfix 2026-05-15 13:15:09 -05:00
163de4c46a Add tunes for later use 2026-05-15 12:10:57 -05:00
9eed69252a Update dependencies 2026-05-15 12:10:41 -05:00
8bd8f518d4 Update readme 2026-05-13 12:56:39 -05:00
82f47093a7 Settings refactor / add birb 2026-05-13 12:30:45 -05:00
e728ddac2c Content updates 2026-05-13 12:30:06 -05:00
0d40f6fb54 Content updates 2026-05-13 12:29:45 -05:00
93a3ae7bf0 Improve compatability with pocket bird extension 2026-04-27 10:08:26 -05:00
a45890d660 Fix margin on form input 2026-04-27 10:08:05 -05:00
58b04186ed content updates 2026-04-27 10:07:44 -05:00
54ed7902db Comment styling fixes 2026-04-26 22:33:54 -05:00
c054d0c3c9 Content updates 2026-04-26 22:33:38 -05:00
9d9bfc895b Fix topic dirs 2026-04-20 12:56:37 -05:00
f4f3cb4e91 Fix styling issue with toc and search regression 2026-04-20 12:48:10 -05:00
72f8eee9cd Make CSS modular 2026-04-20 12:08:30 -05:00
0909926bde Remove unused JS 2026-04-20 12:08:08 -05:00
874ec4c434 Make CSS modular 2026-04-20 12:07:55 -05:00
0cec181ec3 Content Updates 2026-04-20 12:06:51 -05:00
92e077bc57 Content updates 2026-04-17 21:17:15 -05:00
4f0df71c13 Refector css and add TOC 2026-04-17 21:16:51 -05:00
961d4ba3c3 Content updates 2026-04-07 09:46:23 -05:00
664e163baf content updates 2026-03-16 22:38:32 -05:00
546438b830 content updates 2026-03-16 22:38:24 -05:00
a5316f1a69 Search and stuff 2026-03-11 18:58:42 -05:00
238 changed files with 4014 additions and 1482 deletions

View File

@@ -1,6 +1,8 @@
TODO: TODO:
--------------------- ---------------------
Move hard-coded copy to metadata. Move hard-coded copy to metadata.
Fix permanent snowing when user doesn't have JS enabled.
Implement bold text style
Quiz Ideas: Quiz Ideas:
--------------------- ---------------------

View File

@@ -10,18 +10,16 @@ My blog, originally based on the very helpful eleventy-base-blog v8, although it
* Pretty 401 and 403 error pages * Pretty 401 and 403 error pages
### Fediverse Integration ### Fediverse Integration
* Mastodon [toot embedding](https://upchur.ch/gitea/n_u/nathanupchurch.com/wiki/Home#embed-a-toot-from-mastodon-using-the-toot-shortcode)
* Link to post discussion on Mastodon * Link to post discussion on Mastodon
### Indieweb ### Indieweb
* [Auto-generated linktree-style page](https://upchur.ch/gitea/n_u/nathanupchurch.com/wiki#me) for the blog owner with support for custom attributes such as: `rel="me"` * [Auto-generated linktree-style page](https://upchur.ch/gitea/n_u/nathanupchurch.com/wiki#me) for the blog owner with support for custom attributes such as: `rel="me"`
* Built in support for [webring links](https://upchur.ch/gitea/n_u/nathanupchurch.com/wiki#webrings) * Built in support for [webring links](https://upchur.ch/gitea/n_u/nathanupchurch.com/wiki#webrings)
* Auto-generated, **styled** RSS feeds * Auto-generated, *styled* RSS feeds
* All blog posts * All blog posts
* Each individual tag * Each individual tag
* /now page that nicely handles posts tagged with "now" * /now page that nicely handles posts tagged with "now"
* Blogroll generated from _data/blogroll.js, with an automatically updated .opml so that visitors can import every blog in the list * Blogroll generated from _data/blogroll.js, with an automatically updated .opml so that visitors can import every blog in the list
* Image galleries
### Fun ### Fun
* Image galleries * Image galleries

View File

@@ -304,6 +304,13 @@ export default {
url: "https://www.neatorama.com/", url: "https://www.neatorama.com/",
description: "Yep, Neatorama's still around!", description: "Yep, Neatorama's still around!",
}, },
{
title: "Public Domain Review",
feedUrl: "https://publicdomainreview.org/rss.xml",
url: "https://publicdomainreview.org",
description:
"The Public Domain Review is an online journal and not-for-profit project dedicated to the exploration of curious and compelling works from the history of art, literature, and ideas.",
},
{ {
title: "The Pudding", title: "The Pudding",
feedUrl: "https://pudding.cool/rss.xml", feedUrl: "https://pudding.cool/rss.xml",
@@ -350,7 +357,7 @@ export default {
name: "Incense, Fragrance, and Perfumery", name: "Incense, Fragrance, and Perfumery",
blogs: [ blogs: [
{ {
title: "Apothecary's Garden Blog", title: "Apothecarys Garden Blog",
feedUrl: "https://apothecarysgarden.com/blogs/blog.atom", feedUrl: "https://apothecarysgarden.com/blogs/blog.atom",
url: "https://apothecarysgarden.com/blogs/blog", url: "https://apothecarysgarden.com/blogs/blog",
description: description:
@@ -501,6 +508,13 @@ export default {
description: description:
"Started in 1997 by Floor64 founder Mike Masnick and then growing into a group blogging effort, the Techdirt blog relies on a proven economic framework to analyze and offer insight into news stories about changes in government policy, technology and legal issues that affect companies ability to innovate and grow.", "Started in 1997 by Floor64 founder Mike Masnick and then growing into a group blogging effort, the Techdirt blog relies on a proven economic framework to analyze and offer insight into news stories about changes in government policy, technology and legal issues that affect companies ability to innovate and grow.",
}, },
{
title: "The Canary",
feedUrl: "https://www.thecanary.co/feed/",
url: "https://www.thecanary.co/",
description:
"The Canary is a anti-oppression, decolonised, and recolonised radical media outlet that publishes the truth without fear or favour. We publish stories that matter to ordinary people across the UK, whether the corporate and state media like it or not.",
},
{ {
title: "Usermag", title: "Usermag",
feedUrl: "https://www.usermag.co/feed", feedUrl: "https://www.usermag.co/feed",
@@ -593,6 +607,14 @@ export default {
description: description:
"Writing on wet shaving, politics, whole food plant based diets, and more.", "Writing on wet shaving, politics, whole food plant based diets, and more.",
}, },
{
title: "lemon ice cream",
feedUrl:
"https://soundsoflemonicecream.blogspot.com/feeds/posts/default?alt=rss",
url: "https://soundsoflemonicecream.blogspot.com/",
description:
"annabelle kathleen marcile akers - aka lemon ice cream.",
},
{ {
title: "MediaActivist", title: "MediaActivist",
feedUrl: "https://www.mediaactivist.com/rss/", feedUrl: "https://www.mediaactivist.com/rss/",

View File

@@ -1,4 +1,89 @@
export default [ export default [
{
title: "Wild Berry Fizzy Pop Powder",
description:
"Recording my experience burning Wild Berrys Fizzy Pop incense powder.",
synopsis:
"Recording my experience burning Wild Berrys Fizzy Pop incense powder.",
url: "/img/gallery/wild-berry-fizzy-pop/",
date: new Date("May 28, 2026"),
galleryImage: "wild-berry-fizzy-pop-powder-8.webp",
galleryImageAlt: "",
pictures: [
{
title: "Preparing the censer",
filename: "wild-berry-fizzy-pop-powder-1.webp",
altText:
"A brass incense censer with a tool holder and stencil next to a jar of the incense powder.",
thumbAltText:
"A brass incense censer with a tool holder and stencil next to a jar of the incense powder.",
caption: "I feel guilty for sullying this censer.",
},
{
title: "Electric blue",
filename: "wild-berry-fizzy-pop-powder-8.webp",
altText:
"A brass incense spoon scooping bright blue powder from the top of a jar.",
thumbAltText:
"A brass incense spoon scooping bright blue powder from the top of a jar.",
caption: "Just look at the color of this stuff!",
},
{
title: "Adding powder",
filename: "wild-berry-fizzy-pop-powder-2.webp",
altText:
"Putting the electric blue powder atop the brass stencil with a tiny incense spoon.",
thumbAltText:
"Putting the electric blue powder atop the brass stencil with a tiny incense spoon.",
caption: "No turning back now.",
},
{
title: "Adding more powder",
filename: "wild-berry-fizzy-pop-powder-3.webp",
altText:
"Putting more electric blue powder atop the brass stencil with a tiny incense spoon.",
thumbAltText:
"Putting more electric blue powder atop the brass stencil with a tiny incense spoon.",
caption: "Fully committing.",
},
{
title: "Stencil loaded",
filename: "wild-berry-fizzy-pop-powder-4.webp",
altText:
"The grooves of the brass stencil are full of blue incense powder, revealing the shape of an auspicious cloud.",
thumbAltText:
"The grooves of the brass stencil are full of blue incense powder, revealing the shape of an auspicious cloud.",
caption: "That color is wild.",
},
{
title: "Time to get lit",
filename: "wild-berry-fizzy-pop-powder-5.webp",
altText:
"A plasma lighter hovers ominously over the tail of a trail of blue incense powder in the shape of an auspicious cloud, atop a flat layer of ash in a brass censer.",
thumbAltText:
"A plasma lighter hovers ominously over the tail of a trail of blue incense powder in the shape of an auspicious cloud, atop a flat layer of ash in a brass censer.",
caption: "Here we go.",
},
{
title: "Time to get lit",
filename: "wild-berry-fizzy-pop-powder-6.webp",
altText:
"A long, angry-looking ember travels down the trail of blue incense powder.",
thumbAltText:
"A long, angry-looking ember travels down the trail of blue incense powder.",
caption: "What a wicked looking ember.",
},
{
title: "Finally over",
filename: "wild-berry-fizzy-pop-powder-7.webp",
altText:
"A long, angry-looking ember lights the final stretch of the incense seal, leaving a trail of very dark black ash.",
thumbAltText:
"A long, angry-looking ember lights the final stretch of the incense seal, leaving a trail of very dark black ash.",
caption: "At last.",
},
],
},
{ {
title: "Cooking", title: "Cooking",
description: "Some stuff I've made in the kitchen.", description: "Some stuff I've made in the kitchen.",

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,51 @@
<div class="author">
{% if author %}
{% if author.profilePic %}
{% if author.url %}
<a href="{{ author.url }}">
{% endif %}
<img class="profilePic" src="{{ author.profilePic }}">
{% if author.url %}
</a>
{% endif %}
{% endif %}
<p>
{% if author.url %}
<a href="{{ author.url }}">
{% endif %}
{% if author.name %}
<span class="authorName">{{ author.name }}</span>
{% endif %}
{% if author.url %}
</a>
{% endif %}
{% if author.bio %}
<br>{{ author.bio }}
{% endif %}
</p>
{% else %}
{% if metadata.author.profilePic %}
{% if metadata.author.url %}
<a href="{{ metadata.author.url }}">
{% endif %}
<img class="profilePic" src="{{ metadata.author.profilePic }}">
{% if metadata.author.url %}
</a>
{% endif %}
{% endif %}
<p>
{% if metadata.author.url %}
<a href="{{ metadata.author.url }}">
{% endif %}
{% if metadata.author.name %}
<span class="authorName">{{ metadata.author.name }}</span>
{% endif %}
{% if metadata.author.url %}
</a>
{% endif %}
{% if metadata.author.bio %}
<br>{{ metadata.author.bio }}
{% endif %}
{% endif %}
</p>
</div>

17
_includes/birb.njk Normal file
View File

@@ -0,0 +1,17 @@
<!-- Birb -->
<script>
const showBirb = () => {
script = document.createElement('script');
script.setAttribute("src", "https://cdn.jsdelivr.net/gh/IdreesInc/Pocket-Bird@main/dist/web/birb.embed.js");
document.body.appendChild(script);
};
const hideBirb = () => {
window.location.reload();
};
const noBirb = () => {
console.info("Settings: Not showing birb :[");
}
</script>
<!-- /Birb -->

View File

@@ -1,21 +1,25 @@
<footer> <footer>
<p>{% if metadata.copyrightNotice %}<span class="copyright-notice">{{ metadata.copyrightNotice }}</span>{% endif %} <div class="footerContainer">
<p>
{% if metadata.webrings %}<br> {% if metadata.copyrightNotice %}
{% for webring in metadata.webrings %} <span class="copyright-notice">{{ metadata.copyrightNotice }}</span>
{% endif %}
<br>Made by humans, not AI.
<div class="webringsContainer">
{% if metadata.webrings %}{% for webring in metadata.webrings %}
<span class="webring"> <span class="webring">
{% if webring.previousURL %}<a href="{{ webring.previousURL }}">←</a>{% endif %} {% if webring.previousURL %}<a href="{{ webring.previousURL }}">←</a>{% endif %}
{% if webring.ringURL %}<a href="{{ webring.ringURL }}">{{ webring.name }}</a>{% endif %} {% if webring.ringURL %}<a href="{{ webring.ringURL }}">{{ webring.name }}</a>{% endif %}
{% if webring.nextURL %}<a href="{{ webring.nextURL }}">→</a>{% endif %} {% if webring.nextURL %}<a href="{{ webring.nextURL }}">→</a>{% endif %}
</span> </span><br>
{% endfor %} {% endfor %}{% endif %}
{% endif %} </div>
<a href="/sitemap/">Sitemap</a> <div class="linksContainer">
{% if metadata.footerLinks %}{% for link in metadata.footerLinks %}
<a {% if link.onClick %} onCLick="{{ link.onClick }}"{% endif %} href="{{ link.linkURL }}">{{ link.linkDisplay }}</a>
{% endfor %}{% endif %}
</div>
</p> </p>
<div id="buttonsAndStuffContainer">
<a href="https://notbyai.fyi/">
<img src="/img/written-by-human-not-by-ai-white.svg" alt="Written by humans, not by AI.">
</a>
{% include "siteSettings.njk" %}
</div> </div>
</footer> </footer>
{% include "settings/siteSettings.njk" %}

View File

@@ -1,12 +1,4 @@
<a href="#skip" class="visually-hidden">Skip to main content</a> <a href="#skip" class="visually-hidden">Skip to main content</a>
<header> <header>
<a
href="/"
class="home-link">
<img
class="logo"
src="{% if metadata.holidayLogo %}{{ metadata.holidayLogo }}{% else %}{{ metadata.logo }}{% endif %}"
alt="{{ metadata.title }}">
</a>
{% if not hideNav %}{% include "nav.njk" %}{% endif %} {% if not hideNav %}{% include "nav.njk" %}{% endif %}
</header> </header>

View File

@@ -1,78 +0,0 @@
<!-- ISSO style -->
<style>
.isso-comment-header {
height: var(--space-2xl) !important;
}
h4.isso-thread-heading {
color: var(--text-color) !important;
font-size: var(--step-2) !important;
font-variation-settings: "opsz" 50, "wght" 350, "SOFT" 20, "WONK" 1 !important;
line-height: calc(var(--step-2) * 0.25 + var(--step-2)) !important;
margin-bottom: var(--space-m) !important;
margin-top: var(--space-m) !important;
padding-bottom: 0 !important;
padding-top: 0 !important;
text-wrap: pretty !important;
}
.isso-text > h1, .isso-text > h2 {
padding: 0 0 0 0 !important;
}
.isso-form-wrapper > .isso-auth-section > .isso-post-action > input {
background-color: var(--contrast-color) !important;
border: none !important;
border-radius: var(--border-radius) !important;
color: var(--background-color) !important;
font-family: var(--font-family-ui) !important;
font-size: var(--step--2) !important;
font-variation-settings: var(--font-variation-ui) !important;
height: var(--space-m-l) !important;
letter-spacing: var(--ui-letter-spacing) !important;
margin: var(--space-xs) 0 0 0 !important;
padding: 0 var(--space-xs) !important;
text-transform: uppercase !important;
transition: var(--transition-normal) !important;
white-space: nowrap !important;
}
p.isso-input-wrapper {
display: block !important;
max-width: 100% !important;
& > label, & > input {
font-family: var(--font-family-ui) !important;
font-size: var(--step--2) !important;
font-variation-settings: var(--font-variation-ui) !important;
}
& input {
margin-block: inherit !important;
}
}
.isso-post-action {
display: inline-block !important;
float: inherit !important;
margin: 0 var(--space-2xs) 0 0 !important;
&::after {
content: "" !important;
}
}
textarea.isso-textarea {
background-color: var(--background-color) !important;
border: var(--border-details) !important;
border-color: var(--contrast-color) !important;
border-radius: var(--border-radius) !important;
color: var(--text-color) !important;
font-family: var(--font-family) !important;
font-size: var(--step-0) !important;
font-variation-settings: var(--font-variation-default) !important;
margin-block: 0 1lh !important;
min-height: var(--space-l) !important;
padding: 0 var(--space-3xs) !important;
resize: vertical !important;
width: 100%;
}
</style>
<!-- /ISSO style -->

View File

@@ -4,7 +4,46 @@
{% include "metadata.njk" %} {% include "metadata.njk" %}
<link rel="stylesheet" type="text/css" href="/css/index.css" /> <link rel="stylesheet" type="text/css" href="/css/index.css" />
<link rel="stylesheet" type="text/css" href="/css/webfonts/webfonts.css" /> <link rel="stylesheet" type="text/css" href="/css/webfonts/webfonts.css" />
{% if tags and (tags.includes('nowBurning') or tags.includes('status')) %}
<link rel="stylesheet" type="text/css" href="/css/microblog.css" />
{% endif %}
{% if tags and tags.includes('blogroll') %}
<link rel="stylesheet" type="text/css" href="/css/blogroll.css" />
{% endif %}
{% if tags and tags.includes('galleryImage') %}
<link rel="stylesheet" type="text/css" href="/css/gallery-images.css" />
{% endif %}
{% if tags and tags.includes('navigator') %}
<link rel="stylesheet" type="text/css" href="/css/navigator.css" />
{% endif %}
{% if tags and tags.includes('tagList') %}
<link rel="stylesheet" type="text/css" href="/css/tags.css" />
{% endif %}
{% if tags and (tags.includes('posts') or tags.includes('now')) %}
<link rel="stylesheet" type="text/css" href="/css/audio-player.css" />
<link rel="stylesheet" type="text/css" href="/css/code.css" /> <link rel="stylesheet" type="text/css" href="/css/code.css" />
<link rel="stylesheet" type="text/css" href="/css/comments.css" />
<link rel="stylesheet" type="text/css" href="/css/continue-discussion-on-mastodon.css" />
<link rel="stylesheet" type="text/css" href="/css/dropcap.css" />
<link rel="stylesheet" type="text/css" href="/css/fleuron.css" />
{% endif %}
{% if tags and tags.includes('guestbook') %}
<link rel="stylesheet" type="text/css" href="/css/guestbook.css" />
{% endif %}
<link rel="stylesheet" type="text/css" href="/css/weather.css" />
<link rel="stylesheet" type="text/css" href="/css/woo-mode.css" />
{% if tags and tags.includes('quiz') %}
<link rel="stylesheet" type="text/css" href="/css/quiz.css" />
<link rel="stylesheet" type="text/css" href="/css/comments.css" />
{% endif %}
{% if includeTOC %}
<link rel="stylesheet" type="text/css" href="/css/toc.css" />
{% endif %}
{% if search %}
<link rel="stylesheet" href="/pagefind/pagefind-ui.css">
<link rel="stylesheet" type="text/css" href="/css/search.css" />
{% endif %}
<script src="/js/main.js"></script>
<!-- Mochi webmentions --> <!-- Mochi webmentions -->
<link rel="webmention" href="https://mochi-webmentions.meadow.cafe/webmention/mochi@upchur.ch/1/receive" /> <link rel="webmention" href="https://mochi-webmentions.meadow.cafe/webmention/mochi@upchur.ch/1/receive" />
<!-- Indieweb profile links --> <!-- Indieweb profile links -->
@@ -12,19 +51,36 @@
<!-- /Indieweb profile links --> <!-- /Indieweb profile links -->
{% include "structuredData.njk" %} {% include "structuredData.njk" %}
{% include "analytics.html" %} {% include "analytics.html" %}
{% include "issoStyle.njk" %}
{% include "weatherStyle.njk" %}
{% include "wooModeStyle.njk" %}
</head> </head>
<body> <body>
{% include "header.njk" %} {% include "header.njk" %}
<main id="skip"> <main id="skip">
{% if includeTOC %}
<section>
<article data-pagefind-body>
<h1>{{ h1 }}</h1>
<section>
<details class="toc">
<summary>Table of Contents</summary>
{{ content | toc(tags=['h2', 'h3', 'h4'], wrapper='div') | removeHash | safe }}
</details>
</section>
<section> <section>
{{ content | safe }} {{ content | safe }}
</section> </section>
</article>
</section>
{% endif %}
{% if not includeTOC %}
<section>
{{ content | safe }}
</section>
{% endif %}
</main> </main>
{% include "footer.njk" %} {% include "footer.njk" %}
{% include "birb.njk" %}
{% include "weather.njk" %} {% include "weather.njk" %}
{% include "wooMode.njk" %} {% include "wooMode.njk" %}
{% include "settings/settingsConfig.njk" %}
</body> </body>
</html> </html>

View File

@@ -1,6 +1,8 @@
--- ---
layout: layouts/base.njk layout: layouts/base.njk
showPostListHeader: yep showPostListHeader: yep
tags:
- navigator
--- ---
<h1>Im Nathan; welcome&nbsp;friend.</h1> <h1>Im Nathan; welcome&nbsp;friend.</h1>
<p class="nodropcap page-block">My name is Nathan Upchurch, and this is my personal website and blog, where I write about all sorts of <a href="/tags">things</a> that I find interesting. Click through the categories below or see the <a href="/sitemap">sitemap</a> for a full list of everything there is to look at here.</p> <p class="nodropcap page-block">My name is Nathan Upchurch, and this is my personal website and blog, where I write about all sorts of <a href="/tags">things</a> that I find interesting. Click through the categories below or see the <a href="/sitemap">sitemap</a> for a full list of everything there is to look at here.</p>

View File

@@ -1,14 +1,14 @@
--- ---
layout: layouts/linksPage.njk layout: layouts/linksPage.njk
--- ---
<div class="links-container h-card"> <div class="links-container h-card" data-pagefind-body>
<img class="profilePic u-photo" src="{{ metadata.author.profilePic }}"> <img class="profilePic u-photo" src="{{ metadata.author.profilePic }}">
<h1 class="socialTitle p-name">Nathan Upchurch</h1> <h1 class="socialTitle p-name">Nathan Upchurch</h1>
<p class="page-block nodropcap">Beside what I do to earn a crust, among other things, Im an incense maker and enthusiast, a classical trombonist, vegan cook, writer, mediocre photographer, and a fan of, advocate for, and occasional contributor to free and open source software. Heres where you can find me on the internet:</p> <p class="page-block nodropcap">Heres where you can find me on the internet:</p>
<div class="socialLinks"> <div class="socialLinks">
{% for link in metadata.socialLinks %} {% for link in metadata.socialLinks %}
<a class="link-button u-url" {% if link.customAttribute %} {{ link.customAttribute | safe }} {% endif %} href="{{ link.linkURL }}"> <a class="link-button u-url" {% if link.customAttribute %} {{ link.customAttribute | safe }} {% endif %} href="{{ link.linkURL }}">
<button type="button"><img src="{{ link.iconURL }}" />{{ link.linkDisplay }}</button> <button type="button">{{ link.iconSVG | safe }}{{ link.linkDisplay }}</button>
</a> </a>
{% endfor %} {% endfor %}
</div> </div>

View File

@@ -1,45 +1,40 @@
--- ---
layout: layouts/base.njk layout: layouts/base.njk
--- ---
<article class="post"> <article class="post" data-pagefind-body>
<h1>{{ title | safe }}</h1> <div class="hero-container">
{% include "mastodonComments.njk" %} <div class="hero">
{% if not hideMetadata %} <p class="post-taglist">
<div class="post-metadata">
{% if author %}
{% if author.profilePic %}
<img class="profilePic" src="{{ author.profilePic }}">
{% endif %}
<div class="post-metadata-copy">
<p>{% if author.url %}<a href="{{ author.url }}">{% endif %}
{% if author.name %}By {{ author.name }}{% endif %}{% if author.url %}</a>&nbsp;•&nbsp;{% endif %}<time datetime="{{ page.date | htmlDateString }}">{{ page.date | niceDate }}</time>&nbsp;•&nbsp;{{ content | emojiReadTime }}</p>
{% else %}
{% if metadata.author.profilePic %}
<img class="profilePic" src="{{ metadata.author.profilePic }}">
{% endif %}
<div class="post-metadata-copy">
<p>{% if metadata.author.url %}<a href="{{ metadata.author.url }}">{% endif %}
{% if metadata.author.name %}By {{ metadata.author.name }}{% endif %}{% if metadata.author.url %}</a>&nbsp;•&nbsp;{% endif %}<time datetime="{{ page.date | htmlDateString }}">{{ page.date | niceDate }}</time>&nbsp;•&nbsp;{{ content | emojiReadTime }}</p>
{% endif %}
<ul>
{%- for tag in tags | filterTagList %} {%- for tag in tags | filterTagList %}
{%- set tagUrl %}/tags/{{ tag | slugify }}/{% endset %} {%- set tagUrl %}/tags/{{ tag | slugify }}/{% endset %}
<li> <a href="{{ tagUrl }}">#{{ tag }}&nbsp;</a>
<a
href="{{ tagUrl }}"
class="post-tag">
{{ tag }}&nbsp;
</a>
</li>
{%- endfor %} {%- endfor %}
</ul> </p>
<h1>{{ title | markdownify | safe}}</h1>
{% if synopsis %}
<p class="post-synopsis">
{{ synopsis | markdownify | safe}}
</p>
{% endif %}
{% if tags and tags.includes('quiz') %}
<p class="post-synopsis">
{{ content | markdownify | safe}}
</p>
{% endif %}
{% if not tags.includes('quiz') %}
{% if imageURL %}
<a href="{{ imageURL }}"><img class="post-image" src="{{ imageURL }}" alt="{{ imageAlt }}"></a>
{% endif %}
<p class="post-time-author">
<time datetime="{{ page.date | htmlDateString }}">{{ page.date | niceDate }}</time><br>
By <a href="{% if author %}{{ author.url }}{% else %}{{ metadata.author.url }}{% endif %}">{% if author %}{{ author.name }}{% else %}{{ metadata.author.name }}{% endif %}</a></p>
{% endif %}
</div> </div>
</div> </div>
{% endif %} {% if tags and not tags.includes('quiz') %}{{ content | safe }}{% endif %}
{{ content | safe }}
</article> </article>
{% if tags and not tags.includes('quiz') %}
{% include "articleAuthor.njk" %}
{% include "mastodonComments.njk" %}
{% endif %}
{% include "issoCommenting.njk" %} {% include "issoCommenting.njk" %}

View File

@@ -3,6 +3,12 @@ layout: layouts/post.njk
structuredData: none structuredData: none
--- ---
{{ content | safe }} {{ content | safe }}
{% if imageURL %}
<a href="{{ imageURL }}"><img class="post-image" src="{{ imageURL }}" alt="{{ imageAlt }}"></a>
{% endif %}
<p class="post-time-author">
<time datetime="{{ page.date | htmlDateString }}">{{ page.date | niceDate }}</time><br>
By <a href="{% if author %}{{ author.url }}{% else %}{{ metadata.author.url }}{% endif %}">{% if author %}{{ author.name }}{% else %}{{ metadata.author.name }}{% endif %}</a></p>
<section class="quiz"> <section class="quiz">
<form onsubmit="handleQuizSubmit(); return false"> <form onsubmit="handleQuizSubmit(); return false">
{% for question in questions %} {% for question in questions %}

View File

@@ -2,7 +2,15 @@
<div class="continue-discussion"> <div class="continue-discussion">
<a class="link-button" href="https://{{ metadata.mastodonHost }}/@{{ metadata.mastodonUser }}/{{ mastodon_id }}"> <a class="link-button" href="https://{{ metadata.mastodonHost }}/@{{ metadata.mastodonUser }}/{{ mastodon_id }}">
<button type="button"> <button type="button">
<img src="/img/mastodon.svg"> <svg
viewBox="0 0 1536 1792"
xmlns="http://www.w3.org/2000/svg">
<path
d="M1503.302 1111.386c-22.579 116.159-202.224 243.284-408.55 267.921-107.588 12.837-213.519 24.636-326.476 19.455-184.728-8.463-330.494-44.092-330.494-44.092 0 17.983 1.11 35.106 3.328 51.12 24.015 182.308 180.772 193.228 329.261 198.32 149.872 5.127 283.321-36.951 283.321-36.951l6.157 135.491s-104.827 56.293-291.574 66.646c-102.974 5.66-230.836-2.59-379.759-42.009C65.529 1641.797 10.219 1297.502 1.482 948.17-1.11 844.449.485 746.646.49 664.847.5 307.631 234.539 202.924 234.539 202.924c118.011-54.199 320.512-76.99 531.033-78.71h5.173c210.52 1.721 413.152 24.511 531.157 78.71 0 0 234.04 104.706 234.04 461.923 0 0 2.935 263.556-32.64 446.539zm-243.429-418.827c0-88.4-21.711-159.35-67.71-210.618-46.63-51.972-107.687-78.613-183.47-78.613-87.699 0-154.104 33.703-198.002 101.121L768 576l-42.683-71.55c-43.907-67.42-110.313-101.124-198.003-101.124-75.792 0-136.849 26.642-183.47 78.614-45.21 51.973-67.718 122.219-67.718 210.618v432.53h171.359V705.273c0-88.498 37.234-133.415 111.713-133.415 82.35 0 123.63 53.283 123.63 158.646v229.788h170.35V730.505c0-105.363 41.272-158.646 123.62-158.646 74.478 0 111.715 44.917 111.715 133.415v419.816h171.358V692.56z"
id="path1"
style="fill-opacity:1" />
</svg>
Discuss on Mastodon &#187; Discuss on Mastodon &#187;
</button> </button>
</a> </a>

View File

@@ -8,4 +8,3 @@
<meta name="generator" content="{{ eleventy.generator }}"> <meta name="generator" content="{{ eleventy.generator }}">
<link rel="alternate" href="/feed/feed.xml" type="application/atom+xml" title="{{ metadata.title }}"> <link rel="alternate" href="/feed/feed.xml" type="application/atom+xml" title="{{ metadata.title }}">
<link rel="alternate" href="/feed/feed.json" type="application/json" title="{{ metadata.title }}"> <link rel="alternate" href="/feed/feed.json" type="application/json" title="{{ metadata.title }}">
<script type="module" src="/js/main.js"></script>

View File

@@ -1,5 +1,17 @@
<nav> <nav>
<div class="nav-elements-grid-container">
<div class="nav-elements-container">
<h2 class="visually-hidden">Top level navigation menu</h2> <h2 class="visually-hidden">Top level navigation menu</h2>
<a
href="/"
class="home-link">
<svg class="logo" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 8.467 8.467"><path d="M23.248 20.452v6.444c0 1.12.902 2.023 2.023 2.023h4.421c1.12 0 2.023-.902 2.023-2.023v-4.421c0-1.12-.902-2.023-2.023-2.023h-6.444m1.516 1.924q.102.007.255.013a8 8 0 0 0 .848-.013l2.39 3.18V23.32q0-.313-.039-.478a.36.36 0 0 0-.165-.243q-.128-.076-.402-.095v-.128a18 18 0 0 0 .676.02 8 8 0 0 0 .567-.02v.128a.65.65 0 0 0-.312.095.36.36 0 0 0-.147.23 2.3 2.3 0 0 0-.032.44v3.638a1.712 1.712 0 0 0-.268 0l-2.734-3.715v2.753q0 .306.039.478.037.165.166.242.134.07.401.096v.127a3 3 0 0 0-.312-.013 11 11 0 0 0-.676 0q-.153 0-.255.013v-.127a.7.7 0 0 0 .312-.096.34.34 0 0 0 .141-.23q.038-.159.038-.44v-2.943q0-.236-.038-.344a.21.21 0 0 0-.14-.153.9.9 0 0 0-.313-.051zm5.092 3.671a.5.5 0 0 1 .357.128q.14.127.14.337t-.14.338a.5.5 0 0 1-.357.127.52.52 0 0 1-.363-.127.45.45 0 0 1-.134-.338q0-.21.134-.337a.52.52 0 0 1 .363-.128" style="fill-opacity:1;" transform="translate(-23.248 -20.452)"/></svg>
</a>
{% if tags and tags.includes('posts') and not tags.includes('quiz') and not hideBlogTitleFromHeader%}
<a class="blog-name" href="/blog">
{{ metadata.blogName }}
</a>
{% endif %}
<ul class="nav"> <ul class="nav">
{%- for entry in collections.all | eleventyNavigation %} {%- for entry in collections.all | eleventyNavigation %}
<li class="nav-item" {% if entry.url == page.url %} aria-current="page" data-currentpage="true"{% endif %}><a href="{{ entry.url }}">{{ entry.title }}</a></li> <li class="nav-item" {% if entry.url == page.url %} aria-current="page" data-currentpage="true"{% endif %}><a href="{{ entry.url }}">{{ entry.title }}</a></li>
@@ -7,4 +19,6 @@
<li class="subscribe nav-item"><a href="/feed/feed.xml">{% include "rssLogo.njk" %}Feed</a> <li class="subscribe nav-item"><a href="/feed/feed.xml">{% include "rssLogo.njk" %}Feed</a>
</li> </li>
</ul> </ul>
</div>
</div>
</nav> </nav>

View File

@@ -2,7 +2,7 @@
{% for link in metadata.navigatorLinks %} {% for link in metadata.navigatorLinks %}
<div class="navigatorItem"> <div class="navigatorItem">
<a href="{{ link.linkURL }}"> <a href="{{ link.linkURL }}">
<img alt="" src="{{ link.iconURL }}"> {{ link.iconSVG | safe }}
<p>{{ link.linkDisplay }}</p> <p>{{ link.linkDisplay }}</p>
</a> </a>
</div> </div>

View File

@@ -1,62 +0,0 @@
{% if collections.posts %}
{% set previousPost = collections.posts | getPreviousCollectionItem %}
{% set nextPost = collections.posts | getNextCollectionItem %}
{% if nextPost or previousPost %}
<section class="links-nextprev">
<h2>Read Next</h2>
<div class="postlist-item-container">
{% if previousPost %}
<article class="postlist-item{% if post.url == url %} postlist-item-active{% endif %}">
<a href="{{ previousPost.url }}" class="postlist-link">
<div class="post-image-container">
<img class="post-image" {% if previousPost.data.imageURL %} src="{{ previousPost.data.imageURL }}" alt="{{ previousPost.data.imageAlt }}" {% else %} src="{{ metadata.defaultPostImageURL }}" alt="{{ metadata.defaultPostImageAlt }}"{% endif %}>
</div>
</a>
<div class="post-copy">
<a href="{{ previousPost.url }}" class="postlist-link">
<p>Previous Article:</p>
<h3>
{% if previousPost.data.title %}{{ previousPost.data.title }}{% else %}<code>{{ previousPost.url }}</code>{% endif %}
</h3>
</a>
<time class="postlist-date" datetime="{{ previousPost.date | htmlDateString }}">{{ previousPost.date | readableDate("LLLL yyyy") }}</time>
{% if previousPost.data.synopsis %}
<p>{{ previousPost.data.synopsis | truncate(105) | safe }}</p>
{% else %}
<p>{{ previousPost.content | truncate(105) | safe }}</p>
{% endif %}
</div>
</article>
{% if not nextPost %}
</div>
</section>
{% endif %}
{% endif %}
{% if nextPost %}
<article class="postlist-item{% if post.url == url %} postlist-item-active{% endif %}">
<a href="{{ nextPost.url }}" class="postlist-link">
<div class="post-image-container">
<img class="post-image" {% if nextPost.data.imageURL %} src="{{ nextPost.data.imageURL }}" alt="{{ nextPost.data.imageAlt }}" {% else %} src="{{ metadata.defaultPostImageURL }}" alt="{{ metadata.defaultPostImageAlt }}"{% endif %}>
</div>
</a>
<div class="post-copy">
<a href="{{ nextPost.url }}" class="postlist-link">
<p>Next Article:</p>
<h3>
{% if nextPost.data.title %}{{ nextPost.data.title }}{% else %}<code>{{ nextPost.url }}</code>{% endif %}
</h3>
</a>
<time class="postlist-date" datetime="{{ nextPost.date | htmlDateString }}">{{ nextPost.date | readableDate("LLLL yyyy") }}</time>
{% if nextPost.data.synopsis %}
<p>{{ nextPost.data.synopsis | truncate(105) | safe }}</p>
{% else %}
<p>{{ nextPost.content | truncate(105) | safe }}</p>
{% endif %}
</div>
</article>
</div>
</section>
{% endif %}
{% endif %}
{% endif %}

View File

@@ -1,12 +1,14 @@
{% set numPages = pagination.pages | length %} {% set numPages = pagination.pages | length %}
{% if pagination.pageNumber > 0 %} <span class=buttonContainer>
<a href="/{{ paginationRootDir }}/{% if pagination.pageNumber > 1%}page-{{ pagination.pageNumber }}/{% endif %}"> {% if pagination.pageNumber > 0 %}
<a href="/{{ paginationRootDir }}/{% if pagination.pageNumber > 1%}page-{{ pagination.pageNumber }}/{% endif %}">
<button type="button">← Previous</button> <button type="button">← Previous</button>
</a> </a>
{% endif %} {% endif %}
{% if pagination.pageNumber < numPages - 1 %} {% if pagination.pageNumber < numPages - 1 %}
<a href="/{{ paginationRootDir }}/page-{{ pagination.pageNumber + 2 }}/"> <a href="/{{ paginationRootDir }}/page-{{ pagination.pageNumber + 2 }}/">
<button type="button">{% if pagination.pageNumber == 0%}More{% else %}Next{% endif %} →</button> <button type="button">{% if pagination.pageNumber == 0%}Next{% else %}Next{% endif %} →</button>
</a> </a>
{% endif %} {% endif %}
</span>

View File

@@ -1,28 +1,26 @@
<section class="postlist{% if postListTypeMicroblog %} microblogList{% endif %}"> <section class="postlist{% if postListTypeMicroblog %} microblogList{% endif %}">
{% if postlistHeaderText %}<h2>{{ postlistHeaderText }}</h2>{% endif %} {% if postlistHeaderText %}<h2 class="postlist-header">{{ postlistHeaderText }}</h2>{% endif %}
<div class="postlist-item-container"> <div class="postlist-item-container">
{% for post in postslist %} {% for post in postslist %}
<article class="postlist-item{% if post.url == url %} postlist-item-active{% endif %}"> <article class="postlist-item{% if post.url == url %} postlist-item-active{% endif %}">
{% if not postListTypeMicroblog %}
<a href="{{ post.url }}" class="postlist-link">
<div class="post-image-container">
<img class="post-image" {% if post.data.imageURL %} src="{{ post.data.imageURL }}" alt="{{ post.data.imageAlt }}" {% else %} src="{{ metadata.defaultPostImageURL }}" alt="{{ metadata.defaultPostImageAlt }}"{% endif %}>
</div>
</a>
{% endif %}
<div class="post-copy"> <div class="post-copy">
{% if not postListTypeMicroblog %} {% if not postListTypeMicroblog %}
<a href="{{ post.url }}" class="postlist-link"> <a href="{{ post.url }}" class="postlist-link">
{% endif %} {% endif %}
<h3> <h3>
{% if post.data.title %}{{ post.data.title | safe }}{% else %}?{% endif %} {% if post.data.title %}{{ post.data.title | markdownify | safe }}{% else %}?{% endif %}
</h3> </h3>
{% if not postListTypeMicroblog %} {% if not postListTypeMicroblog %}
</a> </a>
{% endif %} {% endif %}
{% if post.data.synopsis %}
<p>{{ post.data.synopsis | markdownify | safe }}</p>
{% endif %}
{% if not post.data.synopsis and post.data.description %}
<p>{{ post.data.description | markdownify | safe }}</p>
{% endif %}
<div class="post-metadata"> <div class="post-metadata">
<div class="post-metadata-copy"> <div class="post-metadata-copy">
<p> <p>
@@ -32,30 +30,25 @@
<a href="{{ post.data.author.url }}"> <a href="{{ post.data.author.url }}">
{% endif %} {% endif %}
{% if post.data.author.name %} {% if post.data.author.name %}
By {{ post.data.author.name }} {{ post.data.author.name }}
{% endif %} {% endif %}
{% if post.data.author.url %}</a>&nbsp;•&nbsp; {% if post.data.author.url %}</a>&nbsp;•&nbsp;
{% endif %} {% endif %}
{% else %}<a href="{{ metadata.author.url }}">By {{ metadata.author.name }}</a>&nbsp;•&nbsp; {% else %}<a href="{{ metadata.author.url }}">{{ metadata.author.name }}</a>&nbsp;•&nbsp;
{% endif %} {% endif %}
{% endif %} {% endif %}
<time datetime="{{ post.date | htmlDateString }}">{{ post.date | niceDate }}{% if post.data.time %}—{{ post.data.time }}{% endif %}</time> <time datetime="{{ post.date | htmlDateString }}">{{ post.date | niceDate }}{% if post.data.time %}—{{ post.data.time }}{% endif %}</time>
</p> </p>
<ul> </div>
{%- for tag in post.data.tags | filterTagList %} </div>
{%- set tagUrl %}/tags/{{ tag | slugify }}/{% endset %} </div>
<li> {% if not postListTypeMicroblog %}
<a <a href="{{ post.url }}" class="postlist-link">
href="{{ tagUrl }}" <div class="post-image-container">
class="post-tag"> <img class="post-image" {% if post.data.imageURL %} src="{{ post.data.imageURL }}" alt="{{ post.data.imageAlt }}" {% else %} src="{{ metadata.defaultPostImageURL }}" alt="{{ metadata.defaultPostImageAlt }}"{% endif %}>
{{ tag }}&nbsp; </div>
</a> </a>
</li> {% endif %}
{%- endfor %}
</ul>
</div>
</div>
</div>
</article> </article>
<hr> <hr>
{% endfor %} {% endfor %}

View File

@@ -0,0 +1,4 @@
<form class="siteSettingsToggle" id="birbController">
<input type="checkbox" id="birbToggle" {% if metadata.weatherOnByDefault %}checked{% endif %} />
<label for="birbToggle">Pet bird (Will refresh page when turned off)</label>
</form>

View File

@@ -1,4 +1,4 @@
<form class="siteSettingsToggle" id="weatherController"> <form class="siteSettingsToggle" id="weatherController">
<input type="checkbox" id="weatherToggle" {% if metadata.weatherOnByDefault %}checked{% endif %} /> <input type="checkbox" id="weatherToggle" {% if metadata.weatherOnByDefault %}checked{% endif %} />
<label for="weatherToggle">Show weather?</label> <label for="weatherToggle">Weather</label>
</form> </form>

View File

@@ -1,4 +1,4 @@
<form class="siteSettingsToggle" id="wooModeController"> <form class="siteSettingsToggle" id="wooModeController">
<input type="checkbox" id="wooToggle" {% if metadata.wooModeOnByDefault %}checked{% endif %} /> <input type="checkbox" id="wooToggle" {% if metadata.wooModeOnByDefault %}checked{% endif %} />
<label for="wooToggle">Woo mode?</label> <label for="wooToggle">Woo mode</label>
</form> </form>

View File

@@ -0,0 +1,37 @@
<!-- Site Settings -->
<script>
const weatherSettings = {
handleOnToggle: turnOnWeather,
handleOnDefault: turnOnWeather,
handleOffToggle: turnOffWeather,
handleOffDefault: turnOffWeather,
settingToggle: "weatherToggle",
preferenceName: "weather",
defaultSetting: {{ metadata.weatherOnByDefault }},
forcedOn: false,
};
const wooModeSettings = {
handleOnToggle: deployWoo,
handleOnDefault: wooSensibleDefault,
handleOffToggle: withdrawWoo,
handleOffDefault: withdrawWoo,
settingToggle: "wooToggle",
preferenceName: "wooMode",
defaultSetting: {% if forcedWoo %}true{% else %}false{% endif %},
forcedOn: {% if forcedWoo %}true{% else %}false{% endif %},
};
const petBirbSettings = {
handleOnToggle: showBirb,
handleOnDefault: showBirb,
handleOffToggle: hideBirb,
handleOffDefault: noBirb,
settingToggle: "birbToggle",
preferenceName: "petBirb",
defaultSetting: false,
forcedOn: false,
};
settingHandler(weatherSettings);
settingHandler(wooModeSettings);
settingHandler(petBirbSettings);
</script>
<!-- /Site Settings -->

View File

@@ -0,0 +1,9 @@
<div id="siteSettingsContainer">
<dialog id="siteSettings">
<h2>Site Settings</h2>
{% include "settings/controllers/birbController.njk" %}
{% include "settings/controllers/weatherController.njk" %}
{% include "settings/controllers/wooModeController.njk" %}
<button id="settingsDone" onclick="siteSettings.close();">Done</button>
</dialog>
</div>

View File

@@ -1,9 +0,0 @@
<div id="siteSettingsContainer">
<button onclick="siteSettings.showModal();">Site Settings</button>
<dialog id="siteSettings">
<h2>Site Settings</h2>
{% include "weatherController.njk" %}
{% include "wooModeController.njk" %}
<button id="settingsDone" onclick="siteSettings.close();">Done</button>
</dialog>
</div>

View File

@@ -18,17 +18,16 @@
{% endif %} {% endif %}
{% if metadata.author.url %} {% if metadata.author.url %}
</a><br /> </a>
{% endif %} {% endif %}
• {{ status.date | niceDate }}<br />
</span> </span>
{% if status.data.comment %}
{{ status.data.comment | markdownify | safe }}<br /> {{ status.data.comment | markdownify | safe }}<br />
{% endif %}
<span class="status-metadata">
{{ status.date | niceDate }}
</span>
</p> </p>
</div> </div>
</div> </div>
</article> </article>
{% endfor %} {% endfor %}

View File

@@ -1,7 +1,7 @@
<!-- weather --> <!-- weather -->
<!-- Based on https://codepen.io/codeconvey/pen/xRzQay --> <!-- Based on https://codepen.io/codeconvey/pen/xRzQay -->
{# This include causes a symbol (text, emoji, et cetera; from metadata.weatherSymbol) to fall from the top of the viewport like snow. #} {# This include causes a symbol (text, emoji, et cetera; from metadata.weatherSymbol) to fall from the top of the viewport like snow. #}
<div class="fallingObjects" id="weather" aria-hidden="true"> <div class="fallingObjects hidden" id="weather" aria-hidden="true">
<div class="fallingObject"> <div class="fallingObject">
<div>{{ metadata.weatherSymbol }}</div> <div>{{ metadata.weatherSymbol }}</div>
</div> </div>
@@ -34,29 +34,15 @@
</div> </div>
</div> </div>
<script> <script>
const weather = document.getElementById("weather"); const turnOnWeather = (containerId) => {
const weatherToggle = document.getElementById("weatherToggle"); const container = document.getElementById(containerId);
const weatherPreference = localStorage.getItem("weather");
// Initial weather preference check on page load
if ({% if metadata.weatherOnByDefault == false %}!weatherPreference || {% endif %}weatherPreference == 0) {
weather.classList.add("hidden");
weatherToggle.checked = false;
} else {
weather.classList.remove("hidden"); weather.classList.remove("hidden");
weatherToggle.checked = true; }
};
// Handle weather setting toggle const turnOffWeather = (containerId) => {
weatherToggle.addEventListener('change', function() { const container = document.getElementById(containerId);
if (this.checked) {
localStorage.setItem("weather", 1);
weather.classList.remove("hidden");
} else {
localStorage.setItem("weather", 0);
weather.classList.add("hidden"); weather.classList.add("hidden");
}; }
}); </script>
</script>
<!-- /weather --> <!-- /weather -->

View File

@@ -1,112 +0,0 @@
<!-- Weather style -->
<style>
.fallingObject {
color: #fff;
font-size: 1em;
font-family: Arial;
pointer-events: none;
text-shadow: 0 0 1px #000;
}
@keyframes fallingObjects-fall {
0% {
top: -10%;
}
100% {
top: 100%;
}
}
@keyframes fallingObjects-shake {
0% {
transform: translateX(0px);
}
50% {
transform: translateX(80px);
}
100% {
transform: translateX(0px);
}
}
.fallingObject {
position: fixed;
top: -10%;
z-index: 9999;
user-select: none;
cursor: default;
animation-name: fallingObjects-fall, fallingObjects-shake;
animation-duration: 10s, 3s;
animation-timing-function: linear, ease-in-out;
animation-iteration-count: infinite, infinite;
animation-play-state: running, running;
}
.fallingObject:nth-of-type(0) {
left: 1%;
animation-delay: 0s, 0s;
& > div {
transform: rotate(45deg);
}
}
.fallingObject:nth-of-type(1) {
left: 10%;
animation-delay: 1s, 1s;
& > div {
transform: rotate(10deg);
}
}
.fallingObject:nth-of-type(2) {
left: 20%;
animation-delay: 6s, 0.5s;
& > div {
transform: rotate(60deg);
}
}
.fallingObject:nth-of-type(3) {
left: 30%;
animation-delay: 4s, 2s;
& > div {
transform: rotate(84deg);
}
}
.fallingObject:nth-of-type(4) {
left: 40%;
animation-delay: 2s, 2s;
& > div {
transform: rotate(267deg);
}
}
.fallingObject:nth-of-type(5) {
left: 50%;
animation-delay: 8s, 3s;
& > div {
transform: rotate(200deg);
}
}
.fallingObject:nth-of-type(6) {
left: 60%;
animation-delay: 6s, 2s;
& > div {
transform: rotate(20deg);
}
}
.fallingObject:nth-of-type(7) {
left: 70%;
animation-delay: 2.5s, 1s;
& > div {
transform: rotate(78deg);
}
}
.fallingObject:nth-of-type(8) {
left: 80%;
animation-delay: 1s, 0s;
& > div {
transform: rotate(3120deg);
}
}
.fallingObject:nth-of-type(9) {
left: 90%;
animation-delay: 3s, 1.5s;
& > div {
transform: rotate(123deg);
}
}
</style>
<!-- / Weather style -->

View File

@@ -2,7 +2,7 @@
<!-- Based on https://codepen.io/tommyho/pen/JjgoZLK --> <!-- Based on https://codepen.io/tommyho/pen/JjgoZLK -->
{# This include replaces the page background with a crazy rainbow animated shader #} {# This include replaces the page background with a crazy rainbow animated shader #}
<canvas id="shaderCanvas"></canvas> <canvas class="hidden" id="shaderCanvas"></canvas>
<script src="/js/three.min.js"></script> <script src="/js/three.min.js"></script>
<script> <script>
let scene, camera, renderer, uniforms, material, mesh; let scene, camera, renderer, uniforms, material, mesh;
@@ -171,30 +171,11 @@
uniforms.time.value = timestamp * 0.001; uniforms.time.value = timestamp * 0.001;
renderer.render(scene, camera); renderer.render(scene, camera);
} }
</script>
<script>
const wooCanvas = document.getElementById("shaderCanvas"); const wooCanvas = document.getElementById("shaderCanvas");
const wooToggle = document.getElementById("wooToggle");
const wooPreference = localStorage.getItem("wooMode");
let forcedWoo = false;
// Initial preference check on page load
if ({% if metadata.wooModeOnByDefault == false %}!wooPreference || {% endif %}wooPreference == 0) {
forcedWoo ? null : wooCanvas.classList.add("hidden");
wooToggle.checked = false;
} else {
wooCanvas.classList.remove("hidden");
wooToggle.checked = true;
initWoo();
animate(0);
};
// Handle setting toggle
wooToggle.addEventListener('change', function() {
if (this.checked) {
localStorage.setItem("wooMode", 1);
// Function for when wooMode is toggled on
const deployWoo = () => {
let wooAudio = new Audio("/audio/30995__unclesigmund__woo-2.mp3"); let wooAudio = new Audio("/audio/30995__unclesigmund__woo-2.mp3");
wooAudio.volume = 0.4; wooAudio.volume = 0.4;
wooAudio.play(); wooAudio.play();
@@ -202,21 +183,19 @@
wooCanvas.classList.remove("hidden"); wooCanvas.classList.remove("hidden");
initWoo(); initWoo();
animate(0); animate(0);
} else { }
localStorage.setItem("wooMode", 0);
forcedWoo ? null : wooCanvas.classList.add("hidden");
};
});
{% if forcedWoo %} // Function for when wooMode is enabled by default
// Handle forced woo const wooSensibleDefault = () => {
forcedWoo = true;
console.log("Forcing woo mode: woo!");
wooCanvas.classList.remove("hidden"); wooCanvas.classList.remove("hidden");
initWoo(); initWoo();
animate(0); animate(0);
{% endif %} }
// Function for when wooMode is toggled off
const withdrawWoo = () => {
wooCanvas.classList.add("hidden");
}
</script> </script>
<!-- /weather --> <!-- /Woo Mode -->

View File

@@ -1,16 +0,0 @@
<!-- Woo mode style -->
<style>
body {
background: none;
}
canvas {
display: block;
opacity: .35;
pointer-events: none;
position: fixed;
top: 0;
left: 0;
z-index: -1;
}
</style>
<!-- / Woo mode style -->

View File

@@ -1,10 +1,11 @@
--- ---
layout: layouts/post.njk layout: layouts/base.njk
title: How to Use Feeds title: Nathan Upchurch | How to Use Feeds
structuredData: none structuredData: none
hideMetadata: yep
--- ---
<p><!-- a <p> just to stop the dropcap from happening --></p> <article data-pagefind-body>
<h1>How to Use Feeds</h1>
Get all the latest content from your favorite creators with no algorithm, no spam, and no spying. This page is based on [Matt Webb](https://interconnected.org)'s *[About Feeds](https://aboutfeeds.com/)*. Get all the latest content from your favorite creators with no algorithm, no spam, and no spying. This page is based on [Matt Webb](https://interconnected.org)'s *[About Feeds](https://aboutfeeds.com/)*.
@@ -66,3 +67,5 @@ It doesn't matter which you choose; newsreaders usually make it fairly easy to e
[^1]: Please note that I haven't tested all of these options personally; your mileage may vary. [^1]: Please note that I haven't tested all of these options personally; your mileage may vary.
</article>

View File

@@ -4,9 +4,10 @@ title: Nathan Upchurch | Colophon
structuredData: none structuredData: none
--- ---
# Colophon <h1>Colophon</h1>
## What I used to build this website ## What I used to build this website
I built this website in plain-old HTML, CSS, and a touch of vanilla JavaScript using [Zach Leatherman](https://www.zachleat.com/)'s [11ty static site generator](https://www.11ty.dev/) and Mozilla's [Nunjucks templating language](https://mozilla.github.io/nunjucks/). I used free and open source variable typefaces [Fraunces](https://fraunces.undercase.xyz/), designed by Phaedra Charles and Flavia Zimbardi[^1], and [Manrope](https://www.gent.media/manrope), designed by Mikhail Sharanda[^2]. I built this website in plain-old HTML, CSS, and a touch of vanilla JavaScript using [Zach Leatherman](https://www.zachleat.com/)'s [11ty static site generator](https://www.11ty.dev/) (now called, *sigh*, Build Awesome) and Mozilla's [Nunjucks templating language](https://mozilla.github.io/nunjucks/). I used free and open source variable typefaces [Fraunces](https://fraunces.undercase.xyz/), designed by Phaedra Charles and Flavia Zimbardi[^1], and [Manrope](https://www.gent.media/manrope), designed by Mikhail Sharanda[^2]. [Search](/search) powered by [Pagefind](https://pagefind.app/). [Guestbook](/guestbook) powered by [Guestbooks](https://guestbooks.meadow.cafe/).
The handy calculators on [utopia.fyi](https://utopia.fyi), created by James Gilyead and Trys Mudford, helped me implement fluid typography and spacing, which has allowed me to make this website responsive without using a single media query. The future is upon us. The handy calculators on [utopia.fyi](https://utopia.fyi), created by James Gilyead and Trys Mudford, helped me implement fluid typography and spacing, which has allowed me to make this website responsive without using a single media query. The future is upon us.

View File

@@ -5,21 +5,22 @@ eleventyNavigation:
key: About key: About
order: 2 order: 2
--- ---
<article> <article data-pagefind-body>
<h1>About me and my&nbsp;website.</h1> <h1>About me and my&nbsp;website.</h1>
<p class="page-block nodropcap">Im a prolific vegan home cook, classical trombonist, incense maker, a <abbr title="Free/Libre Open Source Software">FLOSS</abbr> enthusiast, designer, programmer, music producer, print lover, and human with too many interests and too little time.<br><br> <p class="page-block nodropcap">Im a prolific vegan home cook, classical trombonist, incense maker, a <abbr title="Free/Libre Open Source Software">FLOSS</abbr> enthusiast, designer, programmer, music producer, print lover, and human with too many interests and too little time.<br><br>
This is my little corner of the internet where I talk about whatever I like without worrying about maintaining a personal brand, or constraining my writing to topics which might help advance my career or establish me as a thought leader. Im here to express myself and have fun writing about topics I enjoy.<br><br> This is my little corner of the internet where I talk about whatever I like without worrying about maintaining a personal brand, or constraining my writing to topics which might help advance my career or establish me as a thought leader. Im here to express myself and have fun writing about topics I enjoy.<br><br>
If youd like to learn more about my professional accomplishments and work, Ill link my professional website here when I get around to it.</p> If youd like to learn more about my professional accomplishments and work, Ill link my professional website here when I get around to it.</p>
<a href="./colophon/"> <span class="buttonContainer">
<button type="button">Colophon »</button> <a href="./colophon/">
</a> <button type="button">Colophon</button>
</a>
<a href="../me/"> <a href="../me/">
<button type="button">Contact »</button> <button type="button">Contact</button>
</a> </a>
<a href="./privacy/">
<button type="button">Privacy »</button>
</a>
<a href="./privacy/">
<button type="button">Privacy</button>
</a>
</span>
</article> </article>

View File

@@ -4,7 +4,7 @@ title: Nathan Upchurch | Privacy
structuredData: none structuredData: none
--- ---
# Privacy Statement <h1>Privacy Statement</h1>
## Data collection and use ## Data collection and use
I dont collect any of your personal information, full-stop. All webfonts, icons, and images are hosted locally (these things can sometimes be used to [track people across the internet](https://www.firstpost.com/world/how-google-uses-fonts-to-track-what-users-do-online-and-sell-data-to-advertisers-12496552.html) otherwise). I use [umami](https://umami.is), a free and open source, privacy-respecting analytics tool, to see how many people visit this website. As of 2025-12-16 I also use [Goat Counter](https://goatcounter.com) and [Mochi](https://mochi.meadow.cafe/) (also FLOSS and privacy-respecting) as backups to umami, as my self-hosted umami instance shat the bed the other day and I lost a bunch of data. I dont collect any of your personal information, full-stop. All webfonts, icons, and images are hosted locally (these things can sometimes be used to [track people across the internet](https://www.firstpost.com/world/how-google-uses-fonts-to-track-what-users-do-online-and-sell-data-to-advertisers-12496552.html) otherwise). I use [umami](https://umami.is), a free and open source, privacy-respecting analytics tool, to see how many people visit this website. As of 2025-12-16 I also use [Goat Counter](https://goatcounter.com) and [Mochi](https://mochi.meadow.cafe/) (also FLOSS and privacy-respecting) as backups to umami, as my self-hosted umami instance shat the bed the other day and I lost a bunch of data.

View File

@@ -4,10 +4,15 @@ title: Nathan Upchurch | AI
structuredData: none structuredData: none
--- ---
# AI <article data-pagefind-body>
<h1>AI</h1>
Certified generative AI hater here. This website and all content herein is 100% guaranteed AI slop free: code, prose images, music, et cetera. Certified generative AI hater here. This website and all content herein is 100% guaranteed AI slop free: code, prose images, music, et cetera.
[![Michael Scott from the US version of The Office shaking his head and saying Hmm, nope; don't like that.](/img/the-office-no.gif "#StopTheSlop")](/img/the-office-no.gif) [![Michael Scott from the US version of The Office shaking his head and saying Hmm, nope; don't like that.](/img/the-office-no.gif "#StopTheSlop")](/img/the-office-no.gif)
## AI Permissions ## AI Permissions
I do my utmost to ensure that my work is not hoovered wholesale and regurgitated by AI products by including an [ai.txt file](/ai.txt) and disallowing known crawlers in my [robots.txt file](/robots.txt), but just in case it will ever become meaningful in any legal sense, I'd like to make it clear here that I do not grant permission for any content on this website to be used as training data for any AI project, or for any portion of this website to be scraped by bots associated with AI projects. I do my utmost to ensure that my work is not hoovered wholesale and regurgitated by AI products by including an [ai.txt file](/ai.txt) and disallowing known crawlers in my [robots.txt file](/robots.txt), but just in case it will ever become meaningful in any legal sense, I'd like to make it clear here that I do not grant permission for any content on this website to be used as training data for any AI project, or for any portion of this website to be scraped by bots associated with AI projects.
</article>

View File

@@ -3,5 +3,8 @@ layout: layouts/base.njk
title: Nathan Upchurch | Blank title: Nathan Upchurch | Blank
structuredData: none structuredData: none
--- ---
<article data-pagefind-body>
This page was intentionally left blank. This page was intentionally left blank.
</article>

View File

@@ -4,6 +4,7 @@ description: Answering a lot of questions.
date: 2026-02-05T00:00:00.000Z date: 2026-02-05T00:00:00.000Z
tags: tags:
- Questionnaire - Questionnaire
- Web Development
synopsis: Answering a lot of questions. synopsis: Answering a lot of questions.
mastodon_id: '116021932929019975' mastodon_id: '116021932929019975'
--- ---

View File

@@ -23,7 +23,7 @@ As I brought my laundry basket downstairs earlier today I checked the front porc
The "eleven inch" sticks all come markedly short of eleven inches, and they each have some three-plus inches of bare bamboo stick. Some appear to be machine extruded while others show a coating gradient typical with powder-coated sticks. Strange. I start with a strawberry cone: The "eleven inch" sticks all come markedly short of eleven inches, and they each have some three-plus inches of bare bamboo stick. Some appear to be machine extruded while others show a coating gradient typical with powder-coated sticks. Strange. I start with a strawberry cone:
## Strawberry (Cones) ## Strawberry (Cones)
I'm *sure* I've had these before. I have a feeling they may have been among the incense I picked up from a gas station I once frequented not only for [the drinks with the wee glass lizards on them](https://www.reddit.com/media?url=https%3A%2F%2Fi.redd.it%2Feaqi1o3yv2441.jpg)[^3], but for their gargantuan incense display. The cones have surprisingly little fragrance before they are burned. Upon lighting, they produce a large amount of smoke. There is a sweet, strikingly artificial, strawberry-like fragrance in the burn. It's reminds me of a strawberry juice-box or fruit snack that's 99% apple juice with a hint of strawberry essence. But mostly, I smell the charcoal and some accelerant. The smell is nostalgic, but not good by any stretch. My throat is already feeling slightly irritated; an inauspicious start. Moving on swiftly. I'm *sure* I've had these before. I have a feeling they may have been among the incense I picked up from a gas station I once frequented not only for [the drinks with the wee glass lizards on them](https://www.reddit.com/media?url=https%3A%2F%2Fi.redd.it%2Feaqi1o3yv2441.jpg)[^3], but for their gargantuan incense display. The cones have surprisingly little fragrance before they are burned. Upon lighting, they produce a large amount of smoke. There is a sweet, strikingly artificial, strawberry-like fragrance in the burn. It reminds me of a strawberry juice-box or fruit snack that's 99% apple juice with a hint of strawberry essence. But mostly, I smell the charcoal and some accelerant. The smell is nostalgic, but not good by any stretch. My throat is already feeling slightly irritated; an inauspicious start. Moving on swiftly.
## Coconut ## Coconut
These have a very strong fragrance on the stick. It's sweet and acidic, almost more like a piña colada than coconut. It smells quite delicious. This fragrance is also inducing some nostalgia for me. On lighting, an aggressively sooty flame leaps to cover the first centimeter or so of the stick; oil appears to emerge from the stick directly beneath the flame. The fragrance upon extinguishing the flame is shocking. It's *foul*: vaporized wax, burning plastic, and some odd fishy note with a hint of artificial coconut. It's the kind of smell that makes you feel that your lifespan is being reduced. I put the stick out in short order. These have a very strong fragrance on the stick. It's sweet and acidic, almost more like a piña colada than coconut. It smells quite delicious. This fragrance is also inducing some nostalgia for me. On lighting, an aggressively sooty flame leaps to cover the first centimeter or so of the stick; oil appears to emerge from the stick directly beneath the flame. The fragrance upon extinguishing the flame is shocking. It's *foul*: vaporized wax, burning plastic, and some odd fishy note with a hint of artificial coconut. It's the kind of smell that makes you feel that your lifespan is being reduced. I put the stick out in short order.

View File

@@ -1,6 +1,4 @@
export default { export default {
tags: [ tags: ["posts", "metadata", "profilePic", "tagList"],
"posts" layout: "layouts/post.njk",
],
"layout": "layouts/post.njk",
}; };

View File

@@ -0,0 +1,111 @@
---
title: "Eleventy Becomes, *Sigh*, Build Awesome"
description: "Sustainability? Enshittification? I have some feelings about this."
date: 2026-03-11
tags:
- Eleventy
- Enshittification
- Web Development
synopsis: "Sustainability? Enshittification? I have some feelings about this."
imageURL: /img/eleventy-becomes-sigh-build-awesome/eleventy-logo.png
imageAlt: The old Eleventy logo.
mastodon_id: "116213694439138520"
---
In case you haven't heard, Eleventy, the excellent static site generator that I
use for this very website has been acquired by Font Awesome. As a result, it
has been renamed, *sigh*,
[Build Awesome](https://www.11ty.dev/blog/build-awesome/). After seeing what
happened to [Shoelace](https://shoelace.style/), I'm apprehensive
and very much not looking forward to seeing what features get locked behind a
paywall. But beside the enshittification likely to follow, I thought we'd
stopped appending "awesome" to everything at roughly the same time bacon memes,
curly moustaches, and
[stomp-clap music](https://knowyourmeme.com/memes/stomp-clap-hey-music) went
out of style. It seems like
[I'm not the only one](https://www.allaboutken.com/posts/20260305-digesting-eleventy-becomes-build-awesome/)
who feels this way either.
While disappointed with this state of affairs, I'm not terribly surprised.
Beyond the matter of funding,
[as W. Evan Sheehan of The Darth Mall put it](https://darthmall.net/notes/2026/eleventy-build-awesome/):
> …the vibe of open source in the JavaScript community is a little bit different than what I think of as the broader open source movement. Open source JavaScript projects often feel a little more tied to corporations than Linux, or Python, or NeoVim.
I wholeheartedly agree. There's
[a big difference](https://www.gnu.org/philosophy/open-source-misses-the-point.en.html)
in philosophy between "free software" and "open source," and many JavaScript
projects seem to be firmly in the latter camp.
The choice of the MIT license for Eleventy in the first place speaks
volumes—it's antithetical to the free software movement. The MIT license allows
corporations to snatch up free and open source software, insert whatever
malicious functionality they please, lock down the source code, and abuse the
users they extort with their rent-seeking pricing schemes. On the other hand,
code licensed under a strong copyleft license such as the GPL ensures that
software always remains free (as in speech). Under a strong copyleft license,
anyone can use the software for any purpose. They may study, change, improve,
and redistribute it. But unlike permissive licenses such as the MIT license,
developers may *not* strip these rights from users at any point.
The goal of the free software movement is to create a
[commons](https://en.wikipedia.org/wiki/Commons) of software that anyone is
free to use, study, redistribute, and improve so that abusive software ceases
to be competitive. In terms of how MIT licensed software helps this cause, it's
a bit like putting a soldier on the battlefield with no armor. They may do some
damage, but they're a cinch to eliminate from the field. At this point, I see
MIT licensing as a red flag on all but the very few projects where it makes
sense (such as programming languages). When you decide to rely on MIT-licensed
software for your day to day activities, you never know when it will be
enshittified, put behind a paywall, or
[EEE](https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish)'d out of
existence.
I'm not saying that these things are going to happen to what we knew and loved
as Eleventy. Who knows what the future may bring. But I am saying that this
move is certainly not in the spirit of Free / Libre and Open Source Software. I
fear that the age-old pattern
[that befell Standard Notes](/blog/underrated-apps-qownnotes/) is going to
happen once again here: first attractive new features appear behind a paywall,
then old features you relied on get
[put behind a paywall](https://www.reddit.com/r/StandardNotes/comments/strgh2/very_confused_about_selfhosting_and_extensions/), using the software without paying is slowly made increasingly difficult,
and, before you know it, they
[pull the ol' switcheroo](https://www.reddit.com/r/StandardNotes/comments/16wkrau/note_version_316725_is_the_last_one_to_be_free_or/)
on the license (even if they revert from embarrassment later).
At the same time, despite my misgivings, I'm happy that
[Zach Leatherman](https://www.zachleat.com/) is (I assume) going to be properly
paid to continue his work on the project. It shouldn't be so damned hard to
make a living while performing a public good. Zach seemed pretty happy about
all of this during his appearance on, *sigh*,
[Podcast Awesome](https://www.youtube.com/watch?v=QnnU_iguZ4I). He strikes me
as someone who really cares about his work, and seems a lovely man, always
willing to jump in help someone even when the problem is between the chair and
the keyboard (ask me how I know). Zach deserves, at minimum, to be paid a
decent salary for his contribution to the world, and I'm thrilled that it seems
he's going to get at least that.
Now I'm tempted to turn this into a screed on funding for FLOSS projects, but
better informed people than I have written plenty of those already, so I'll
leave it at this—the fact that NASA, Cern, Google, Microsoft, Mozilla, Ubuntu,
JetBrains, CloudCannon, Netlify, Cloudflare, Shopify, MIT, Stanford, the
governments of France, the UK, and the USA, Orange, Red Hat, Just Eat,
[and others](https://www.11ty.dev/#why-should-you-use-eleventy) didn't manage
to muster between them
[a piddling $6,000 per month](https://www.zachleat.com/web/independent-sustainable-11ty/#asking-for-help)
to pay the developer of a tool they use to publish their websites is *disgusting*. We might have avoided this situation if they had.
I developed something like a brand loyalty to Eleventy. It's a scrappy project
from a talented developer who has managed to keep it alive and well for eight
years. The project has become widely used because *it's excellent*: flexible,
powerful, fast, and easy to use for web developers who are used to working with
JavaScript. I'm sad to see the name go, along with the red balloon, and that
scruffy possum. The [clean, middle-class replacement](https://github.com/11ty/11ty-website/blob/main/src/img/mascots/awesome-possum-balloon-smile-sm.svg) with its stupid *clothing*
and *fancy green balloon* [^1] can take a hike—I can't believe they've
gentrified the damn mascot!
[![Grumpy, one of Eleventy's mascot possums suspended from a red balloon in a field of stars.](/img/eleventy-becomes-sigh-build-awesome/grumpy_among_the_stars.webp "They say Grumpy floats among the stars now.")](/img/eleventy-becomes-sigh-build-awesome/grumpy_among_the_stars.webp)
While I have major apprehensions about where, *sigh*, Font Awesome is going to take the project, I suppose we'll just have to wait and see where this goes. In the meantime, let's all be sure to donate to the FLOSS projects we use, publicly shame corporations who don't give back to the projects they profit from, and pressure our representatives to fund FLOSS software!
[^1]: And green is my favorite color, too :[

View File

@@ -5,6 +5,7 @@ date: 2024-12-02
tags: tags:
- Site Updates - Site Updates
- Eleventy - Eleventy
- Web Development
synopsis: At last, I've gotten around to implementing image galleries. synopsis: At last, I've gotten around to implementing image galleries.
imageURL: /img/isabella-fischer-X2l9M6jsS7E-unsplash.webp imageURL: /img/isabella-fischer-X2l9M6jsS7E-unsplash.webp
imageAlt: Some very tasty looking pop tarts with pink icing and sprinkles. imageAlt: Some very tasty looking pop tarts with pink icing and sprinkles.

View File

@@ -10,6 +10,9 @@ imageAlt: "What appears to be a pack of cigarettes labeled 11:11. There is also
synopsis: "Taking a look at Boy Vienna's viral cigarette incense sticks." synopsis: "Taking a look at Boy Vienna's viral cigarette incense sticks."
mastodon_id: "114462578542598320" mastodon_id: "114462578542598320"
--- ---
::: info
Update: Boy Vienna's 11:11 sticks have since also been reviewed on [rauchfahne.de](https://blog.rauchfahne.de/en/2025/11/29/boy-vienna-1111-en/).
:::
[Boy Vienna](https://boyvienna.com/) is a brand from fashion designer and multi-media artist [Afaf Fi Seyam](https://www.instagram.com/zeopatra) that has been receiving attention on [TikTok](https://www.tiktok.com/@boyvienna/video/7366977382508514603) and [Instagram](https://www.instagram.com/zeopatra/reel/DAyIy2Lv0RQ/) for its incense cigarettes. As opposed to the tobacco variety, these "cigarettes" are designed to be lit and allowed to burn like an incense-stick; they are not to be inhaled. I knew I was going to have to try these sticks the minute they found their way onto my screen—it would seem that [everyone else felt the same way](https://www.instagram.com/zeopatra/p/DJHP0a3NnlI/), as when I made my way to the web store most of Boy Vienna's incense varieties were sold out. For 35 {{ "USD" | abbr("United States Dollars") | safe }}, I was able to snag a box of the 11:11 variety, listed as containing a blend of sage, lavender, and rosemary. [Boy Vienna](https://boyvienna.com/) is a brand from fashion designer and multi-media artist [Afaf Fi Seyam](https://www.instagram.com/zeopatra) that has been receiving attention on [TikTok](https://www.tiktok.com/@boyvienna/video/7366977382508514603) and [Instagram](https://www.instagram.com/zeopatra/reel/DAyIy2Lv0RQ/) for its incense cigarettes. As opposed to the tobacco variety, these "cigarettes" are designed to be lit and allowed to burn like an incense-stick; they are not to be inhaled. I knew I was going to have to try these sticks the minute they found their way onto my screen—it would seem that [everyone else felt the same way](https://www.instagram.com/zeopatra/p/DJHP0a3NnlI/), as when I made my way to the web store most of Boy Vienna's incense varieties were sold out. For 35 {{ "USD" | abbr("United States Dollars") | safe }}, I was able to snag a box of the 11:11 variety, listed as containing a blend of sage, lavender, and rosemary.
[![What appears to be a pack of cigarettes labeled 11:11. There is also a card featuring the brand name Boy Vienna and a temporary tattoo featuring an image of a lipstick-print and the brand name.](/img/boy_vienna_11_11/boy_vienna_11_11_incense_cigarette_sticks_2.webp "The pack also came with a wee temporary tattoo. Fun!")](/img/boy_vienna_11_11/boy_vienna_11_11_incense_cigarette_sticks_2.webp) [![What appears to be a pack of cigarettes labeled 11:11. There is also a card featuring the brand name Boy Vienna and a temporary tattoo featuring an image of a lipstick-print and the brand name.](/img/boy_vienna_11_11/boy_vienna_11_11_incense_cigarette_sticks_2.webp "The pack also came with a wee temporary tattoo. Fun!")](/img/boy_vienna_11_11/boy_vienna_11_11_incense_cigarette_sticks_2.webp)

View File

@@ -0,0 +1,133 @@
---
title: "Incense Review: Hippy Hug, Lavender Française, and White Sage Mage by The World Makes Scents"
description: "Reviewing Hippy Hug, Lavender Française, and White Sage Mage from The World Makes Scents"
date: 2026-04-26
tags:
- Incense
- Incense Review
synopsis: "Reviewing Hippy Hug, Lavender Française, and White Sage Mage from The World Makes Scents."
imageURL: /img/TWMS2026/the-world-makes-scents-incense.webp
imageAlt: "A closeup of The World Makes Scents' new incense packaging with a few loose cones."
mastodon_id: "116474428801255815"
---
In the interest of transparency: as readers may recall, I
[paid Dave a visit](/blog/visiting-chicago-incense-maker-dave-of-the-world-makes-scents/)
at the company's workshop in 2024. Since then, I've been back several times and
we remain friends, trading ingredients, incense, and knowledge. I also received
this incense for free. Despite this, as always, I will do my best to be
objective.
[![A closeup of The World Makes Scents' new incense packaging with a few loose cones.](/img/TWMS2026/the-world-makes-scents-incense.webp "The new packaging is fun, don't you think?")](/img/TWMS2026/the-world-makes-scents-incense.webp)
## Hippy Hug Sticks
First of all I'd like to point out that TWMS has updated their packaging. It's
vibrant, colorful, and fun. The illustration on the *Hippy Hug* packaging is,
however, clearly AI generated, which [I have some feelings about](ai/), but the
overall effect is playful and creative, which I find refreshing.
The 12 thick sticks are wrapped in colorful paper inside TWMS' trademark
jewelry box—an improvement on the synthetic batting material which would
sometimes cling to the sticks. I'm struck right away, as I was with each
variety in today's selection, by the strength of fragrance from the unlit
incense. With *Hippy Hug*, I get a lovely hit of clove and patchouli. The sticks
are about 4mm in diameter, and dark brown, with a rather coarse texture.
They're also solid, with little give and no crumbling or breakage in the
package.
On lighting smoky, patchouli, and sweet vanillic notes emerge. Clove follows as
the initial burst of smoke recedes into a surprisingly gentle stream from the
large stick. If you're familiar with sweet patchoui fragrances, such as
*Patchouli* from Shoyeido's *Overtones* collection, *Hippy* *Hug* doesn't quite
match this profile. While the sweetness is clear, this stick somehow leans dry,
leaving room for the clove to mingle with what I assume is a wood binder
(binders no longer appear to be listed on the ingredients) to make a
spicy/smoky effect.
The patchouli seems to have been used judiciously: just enough to make the
composition work. There is undoubtedly a 'campfire' aspect to this stick,
but it comes across as more woodsmoke than that riproaring, herbaceous
burning-vegetation note that you get when you overdose anything leafy. In
addition to patchouli, sandalwood, benzoin, and clove, the ingredients also
note the inclusion of frankincense. When I look for it, I think I may be able
to identify something of a resin-note in the fragrance, but it's certainly not
jumping out at me. The sandalwood is also a background player here.
I'd really been looking forward to trying this latest take on patchouli from
TWMS since I learned that the team was revising and upgrading some of their old
single-note formulas. I wasn't disappointed. As perhaps reflected by the name
change, while still a patchouli fragrance, the new iteration has evolved from a
single-note stick into an honest-to-god composition, and I'm here for it.
## Lavender Française
The fragrance of the unlit cones is lovely; a juicy lavender note with a hint
of Australian sandalwood. This is a markedly less complex fragrance than *Hippy
Hug,* but what it lacks in complexity is makes up for in clarity. It's
impressively lavender-forward while somehow avoiding much of the harshness that can
come from lavender flowers. A pleasant benzoin sweetness underscores the floral
note. I don't notice much of a sandalwood fragrance in the burn.
Like any wood-based cone, you won't want to sit right next to this incense, but
then again you don't need to. Even in my large office, with relatively little
airflow, the fragrance traverses the distance from the incense table to the
computer desk with little trouble. Giving this cone some room to breathe nets a
relatively clean, room-filling fragrance. There does seem to be a wood binder
note that somewhat muddies the waters, but it's not terribly obtrusive.
The fragrance naturally becomes a little rough around the edges as the diameter
increases near the base of the cone, and the formerly modest smoke production
ramps up quite seriously. That said, the formula seems to handle the change in
diameter well. As the ember travels down the cone, the lavender begins to
exchange its juicy, fruity character for a more herbal, camphoraceous scent.
The fragrance also becomes more smoky, as is to be expected. In contrast to
some of the cheap wood-and-synthetic-fragrance based cones I've tried, the
effect here is more that of an evolving fragrance than a devolving one. I think
I'd still prefer a stick, but I'd be lying if I said that I didn't enjoy this
experience.
## White Sage Mage
The fragrance of the unlit cones is a pleasant sage note. I don't get any
sandalwood this time for whatever reason. The fragrance immediately after
lighting is sage forward, herbaceous, and a touch smoky, although significantly
less so than burning a sage bundle. I never could understand why people insist
on burning sage bundles for fragrance. The result of such a large amount of
herbs burning at once is, for me, overwhelmingly rough and unpleasant. I much
prefer this format: carefully processed sage included in a combustible incense
as part of a well considered formula. It's cleaner, and as sage happens to be a
very potent herb, it still offers more than enough of a sage fragrance. In
fact, like *Lavender Française*, the star botanical almost entirely comprises
the fragrance here.
The inclusion of a little lavender in these cones is a nice addition—the floral
note lifts the fragrance from poultry-seasoning territory (always a risk with
sage). The ingredients also note the inclusion of frankincense, but I couldn't
pick it out; I suspect it may have been included to regulate the burn
temperature somewhat. Again, the fragrance has no trouble filling the room.
This cone is also subject to the pitfalls of the format, but it handles them
fairly well.
## Conclusion
After experiencing this selection, I remain impressed at the quality of
fragrance that The World Makes Scents is able to produce with carefully
processed whole botanicals. As one of the very few incense brands on the market
that you can be sure uses no synthetics or concentrates, it remains my go-to
recommendation for people seeking an entirely natural combustible incense in
the U.S.A.
While the brand's cones are, in my opinion, some of the better examples of the
format, I still do recommend that people nab a
[censer](https://shoyeido.com/products/incense-holder-bowl), some
[ash](https://shoyeido.com/products/accessory-miyakohai-ash), and buy sticks
where possible.[^1]
[^1]: Unfortunately, when I made my order almost all of the sticks
were out of stock on the [website](https://theworldmakesscents.com/), and I am
trying to wean myself off of Amazon
[for](https://en.wikipedia.org/wiki/Criticism_of_Amazon)
[ethical](https://www.ethicalconsumer.org/retailers/ten-reasons-avoid-amazon)
[reasons](https://socialjusticebooks.org/about/why-boycott-amazon/).

View File

@@ -0,0 +1,39 @@
---
title: "One Last Chance for Wild Berry: Reviewing Fizzy Pop Incense Powder"
description: "If this isn't any good, I'm giving up on Wild Berry once and for all."
date: 2026-05-28
tags:
- Incense
- Incense Review
synopsis: "If this isn't any good, I'm giving up on Wild Berry once and for all."
imageURL: /img/gallery/wild-berry-fizzy-pop/wild-berry-fizzy-pop-powder-5.webp
imageAlt: "A plasma lighter hovers ominously over the tail of a trail of blue incense powder in the shape of an auspicious cloud, atop a flat layer of ash in a brass censer."
mastodon_id: "116653399110363374"
---
Some time ago, I [reviewed a variety](/blog/an-evening-with-americas-best-incense-wild-berry/) of Wild Berry incense sticks and cones. If you don't know how that went, here's an idea:
> Its the kind of smell that makes you feel that your lifespan is being reduced… off-notes are tremendous… beginning to feel as though Ive french-inhaled my way through a pack of menthol Newports.
I didn't think I'd wind up returning to the brand, but I figured I'd give them one last chance before I completely wrote it off. If you haunt [/r/incense](https://www.reddit.com/r/Incense/) as much I do, you'll know that *Fizzy Pop* is rated highly by Wild Berry fans. Since my last experience with Wild Berry's incense, I've felt that it may have been a bit of an oversight not to try *Fizzy Pop*. I was also curious about the company's incense powder offering. Not only is it unusual for a western incense brand to offer powder, but in my experience powders don't tend to contain all of the off-notes you might imagine to be supplied by bamboo sticks and binders. It's much easier to make a powder that doesn't stink to the heavens than it is a stick. With that thought, my mind was made up. I simply hadn't been fair to Wild Berry until I'd tried the powder variant of their fan favorite.
Ten Trumpland fun-bucks, plus shipping, will net you a jar containing 38 grams of shockingly blue incense powder—approximately twelve hours of burn time according to the side of the jar. I sure hope I like this stuff. The fragrance upon opening the jar is a lot of fun. It's strong, smelling distinctly like a concentrated lemon-lime soda syrup, or a fizzy lemon-lime candy. It's uncanny; a super bright, almost powdery, white-musk / laundry detergent note offers a real sensation of effervescence. There are going to be a lot of people who find the unburned fragrance of this stuff sickly, but I happen to love candy and don't mind smells in this category. I don't necessarily want my apartment fragranced of it, but it's fun to smell.
[![A brass incense spoon scooping bright blue powder from the top of a jar.](/img/gallery/wild-berry-fizzy-pop/wild-berry-fizzy-pop-powder-8.webp "Just look at the color of this stuff!")](/img/gallery/wild-berry-fizzy-pop/wild-berry-fizzy-pop-powder-8.webp)
I must admit that it felt *wrong* loading up a stencil with this lightning-blue powder in my Chinese censer. The test-blends I use this thing to burn might not always be great, but they are made of real aromatic woods, resins, and other botanicals. The powder texture was pretty perfect, however, and it was easy enough to make a neat incense seal.
[![A plasma lighter hovers ominously over the tail of a trail of blue incense powder in the shape of an auspicious cloud, atop a flat layer of ash in a brass censer.](/img/gallery/wild-berry-fizzy-pop/wild-berry-fizzy-pop-powder-5.webp "Lighting the inauspicious cloud.")](/img/gallery/wild-berry-fizzy-pop/wild-berry-fizzy-pop-powder-5.webp)
Upon lighting, a long, angry red ember took hold, quickly working its way down the electric blue trail and turning it into a spookily dark black ash. The fragrance that emerged immediately alerted me to the fact that this experiment was a grave mistake. While scrambling to get away without knocking over my camera, I scribbled onto an upside-down notepad:
> fishy , burning laundry-detergent. metallic. ~~Like~~ smelled like ~~in~~ the ashes of incense. <u>Diabolical</u>. maybe the faintest hint of sprite.
As I paced the living room, trying to come to terms with what I was experiencing, I realized that I was going to have to sit back down next to the burning incense to take more pictures. Behind the camera the fishy smoke followed me, flying straight at my face like I'd offended it. I covered my mouth with my shirt; it did little good. Even the ember looked like it had it in for me.
[![A long, angry-looking ember travels down the trail of blue incense powder.](/img/gallery/wild-berry-fizzy-pop/wild-berry-fizzy-pop-powder-6.webp "That mean glow frightens me. See more pictures in [the gallery](/gallery/wild-berry-fizzy-pop-powder/).")](/img/gallery/wild-berry-fizzy-pop/wild-berry-fizzy-pop-powder-6.webp)
In the aftermath of this ordeal, It occurred to me that I may not have managed to write in sufficient detail to constitute a review. I thought about burning another trail to analyze the incense more closely, but I just can't bring myself to do it.
[![My scribbled note, with the underlined word "diabolical" highlighted. The notepad sits on top of a black fabric patch for a Black Metal act. An air-conditioner remote can be seen in the top right corner.](/img/wild-berry-fizzy-pop-powder/diabolical.webp "My \"notes.\"")](/img/wild-berry-fizzy-pop-powder/diabolical.webp)
But, really, what more can I say? In my struggle to record the many emotions and sensations I was experiencing, I don't know that I could do much better than "<u>Diabolical</u>" at the time, and I don't know that I can do better now. Yes, I think I'm done with Wild Berry for good at this point. After two, frankly, *harrowing* experiences with the brand, I don't even know that I can muster the courage to try the "Mystic Meadow" sample sticks they've sent me. Not to put too fine a point on it, but how a company can develop, approve, and sell an incense powder that smells so strikingly, aggressively, offensively bad is truly beyond me.

View File

@@ -1,7 +1,12 @@
--- ---
eleventyExcludeFromCollections: true eleventyExcludeFromCollections: true
layout: layouts/base.njk layout: layouts/base.njk
hideBlogTitleFromHeader: true
title: "The Stochastic Bletherist | The Personal Blog of Nathan Upchurch" title: "The Stochastic Bletherist | The Personal Blog of Nathan Upchurch"
tags:
- metadata
- postList
- tagList
structuredData: none structuredData: none
pagination: pagination:
data: collections.posts data: collections.posts
@@ -15,31 +20,28 @@ paginationRootDir: blog
<h1>The Stochastic Bletherist</h1> <h1>The Stochastic Bletherist</h1>
<p class="page-block nodropcap"> <p class="page-block nodropcap">
The personal blog of Nathan Upchurch, where he writes about everything from <a href="/tags/storytime">personal stories</a> to <a href="/tags/gnu-linux">tech</a>, <a href="/tags/vegan-cooking">food</a>, and <a href="/tags/incense">incense</a>.<br /> <em>The Stochastic Bletherist</em> is the personal blog of Nathan Upchurch, where he writes about whatever he fancies at the time. <a href="/feed/feed.xml">Subscribe</a> if youre interested in musings on life, music, and technology, weird and wonderful incense reviews, the occasional bit of spicy discourse, or learning how to make things like vegan ranch dressing or incense sticks. Theres something for everyone here.
<span class="buttonContainer">
<a href="/tags/"> <a href="../blogroll/">
<button type="button">Topics »</button> <button type="button">Blogroll</button>
</a> </a>
<a href="../blogroll/"> <a href="/search/">
<button type="button">Blogroll »</button> <button type="button">Search</button>
</a> </a>
<a href="/tags/">
<button type="button">Topics</button>
</a>
</div>
</p> </p>
<h2>Whats New:</h2>
{% else %} {% else %}
<h1>The Stochastic Bletherist Blog</h1> <h1>The Stochastic Bletherist</h1>
<p class="page-block nodropcap">
Writing about everything from <a href="/tags/storytime">personal stories</a> to <a href="/tags/gnu-linux">tech</a>, <a href="/tags/vegan-cooking">food</a>, and <a href="/tags/incense">incense</a>.<br />
<a href="/tags/"> <p class="page-block nodropcap">
<button type="button">Topics »</button> <em>The Stochastic Bletherist</em> is the personal blog of Nathan Upchurch, where he writes about whatever he fancies at the time. <a href="/feed/feed.xml">Subscribe</a> if youre interested in musings on life, music, and technology, weird and wonderful incense reviews, the occasional bit of spicy discourse, or learning how to make things like vegan ranch dressing or incense sticks. Theres something for everyone here.
</a>
<a href="../blogroll/">
<button type="button">Blogroll »</button>
</a>
</p> </p>
<h2>More posts:</h2> <h2 class="postlist-header">More posts:</h2>
{% endif %} {% endif %}

View File

@@ -5,6 +5,7 @@ date: 2025-02-04
tags: tags:
- Site Updates - Site Updates
- Eleventy - Eleventy
- Web Development
synopsis: "Remember when internet quizzes were a thing? I wanted to bring them to my website." synopsis: "Remember when internet quizzes were a thing? I wanted to bring them to my website."
imageURL: "" imageURL: ""
imageAlt: "" imageAlt: ""

View File

@@ -5,6 +5,7 @@ date: 2024-10-23
tags: tags:
- Music - Music
- Site Updates - Site Updates
- Web Development
synopsis: "I've gone and built a not-so-fancy audio component for my blog." synopsis: "I've gone and built a not-so-fancy audio component for my blog."
imageURL: /audio/covers/ballin.webp imageURL: /audio/covers/ballin.webp
imageAlt: An uncapped fountain pen on top of a pretty, gold-foiled pad of paper beside some envelopes with stamps featuring coffee drinks on them. imageAlt: An uncapped fountain pen on top of a pretty, gold-foiled pad of paper beside some envelopes with stamps featuring coffee drinks on them.

View File

@@ -0,0 +1,42 @@
---
title: "Revisiting Sweet Agarwood, and a Bonus Quiz"
description: "Another attempt at making a sweet-agarwood style incense stick using agarwood skins."
date: 2026-04-26
tags:
- Incense
- Incense Making
- Incense Builds (Recipes)
synopsis: "Another attempt at making a sweet-agarwood style incense stick using agarwood skins."
imageURL: /img/incense-recipe-an-attempt-at-a-sweet-agarwood-incense-stick/agarwood-skins.webp
imageAlt: "Small flat slivers, or skins, of agarwood showing darker resinated wood streaked with white unresinated wood."
mastodon_id: "116474435778369320"
---
My [last attempt](/blog/incense-recipe-an-attempt-at-a-sweet-agarwood-incense-stick/#fn2) at a sweet agarwood stick was okay but, as I noted, there was room for improvement. My goals with the original build were to create a decent amount of agarwood fragrance, while mitigating the harsh note that comes with cheaper wood. Following my notes from the old build, my new objectives are to increase the amount of agarwood fragrance, reduce sweetness, and add complexity.
### The Build
|Ingredient |Grams|% of Build|
|------------------------|-----|----------|
|Agarwood |3 |24.90% |
|Benzoin Siam |0.4 |3.32% |
|Borneol Camphor |0.7 |5.81% |
|Cassia |1.0 |8.30% |
|Clove |1.2 |9.96% |
|Guar Gum |0.35 |2.90% |
|Musk Root |0.4 |3.32% |
|Santalum album |4.0 |33.20% |
|Santalum spicatum |1.0 |8.30% |
First of all, I included S. album *and* S. spicatum this time. I was curious to try Indian sandalwood in this version, but I also wanted to use at least a little of my superfine Australian sandalwood powder because of how it helps to make a smooth, easily extruded dough.
### Results
Rather than extruding sticks right away, I decided to burn the powder as an incense-seal to trial it. Once again, the incense is very sweet. Adding a heaping helping of S. album surely didn't help this, but I think it may be time to consider forgoing the benzoin altogether. I'm not sure I like musk root with benzoin either.
The spices are there but, as everything is muddied by the excessive sweetness, it's hard to form an opinion on the spice levels. That said, this attempt is definitely missing something. I think I may include anise in a future iteration.
I like the level of camphor; the coolness is close to something like Yamadamatsu's *Suifu*, although I will have to wait and see how I like it without the benzoin. One thing I do miss from *Suifu* is that rich, sort of dried-fruit note. My guess is that this comes from using a better quality agarwood.
I am happier with the quantity of agarwood this time. There is still a harshness to the agarwood fragrance when the incense is burning nearby, but with a little distance everything mellows out significantly. The agarwood is pretty distinctly sour, which I'm not the biggest fan of, but I don't think there's much I can do about that as it seems to be a characteristic of the wood I'm using. So although I'm not a great fan of this particular wood in combustible incense, it's showing up and doing what it's supposed to, and I'm just going to have to be content with that.
## Bonus: take the incense ingredient quiz!
After building [the quiz feature](/quizzes/) something like a year ago, I have finally gotten around to making another quiz! This time, it's a test of your whole-botanical incense ingredient knowledge. So if you think you know your lavender from your labdanum, why not test your mettle and [give it a shot](/quizzes/incense-ingredient-quiz/)?

View File

@@ -4,6 +4,7 @@ description: QOwnNotes is a terminally underrated native markdown note-taking ap
synopsis: QOwnNotes is a terminally underrated native markdown note-taking app, despite the fact that you'll rarely see it mentioned on the internet. synopsis: QOwnNotes is a terminally underrated native markdown note-taking app, despite the fact that you'll rarely see it mentioned on the internet.
date: 2023-08-09 date: 2023-08-09
tags: tags:
- Enshittification
- FOSS/FLOSS - FOSS/FLOSS
- Underrated Apps - Underrated Apps
imageURL: /img/qownnotes.webp imageURL: /img/qownnotes.webp
@@ -13,7 +14,7 @@ mastodon_id: "110862579682916657"
[![A screenshot of QOwnNotes showing a note subfolder panel beside markdown editor and preview panels.](/img/qownnotes.webp "QOwnNotes running on EndeavourOS / KDE Plasma")](/img/qownnotes.webp) [![A screenshot of QOwnNotes showing a note subfolder panel beside markdown editor and preview panels.](/img/qownnotes.webp "QOwnNotes running on EndeavourOS / KDE Plasma")](/img/qownnotes.webp)
## What makes a good note taking app? ## What makes a good note taking app?
After its author decided to make future versions closed-source, I found myself searching for a replacement for the excellent [Notable](https://notable.app/). Unfortunately, while note-taking applications are a dime a dozen, they're also common ground for the [Notable](https://notable.app/) / [SimpleNote](https://simplenote.com/) style FLOSS bait-and-switch: developers release an outstanding note-taking app, only to make future versions closed-source, or make it inordinately difficult to properly and fully make use of the software without paying for a hosted service. Victim to the former, I set out to find a note-taking app that I felt could not only be trusted to operate in the spirit of FLOSS philosophy, but also met some key criteria: After its author decided to make future versions closed-source, I found myself searching for a replacement for the excellent [Notable](https://notable.app/). Unfortunately, while note-taking applications are a dime a dozen, they're also common ground for the [Notable](https://notable.app/) / [Standard Notes](https://standardnotes.com/) style FLOSS bait-and-switch: developers release an outstanding note-taking app, only to make future versions closed-source, or make it inordinately difficult to properly and fully make use of the software without paying for a hosted service. Victim to the former, I set out to find a note-taking app that I felt could not only be trusted to operate in the spirit of FLOSS philosophy, but also met some key criteria:
1. Native Code 1. Native Code

View File

@@ -0,0 +1,45 @@
---
title: Making a Decent Vegan Ranch Dressing
description: Veganizing the corpulegenic condiment at the pinnacle of American sauces.
synopsis: Veganizing the corpulegenic condiment at the pinnacle of American sauces.
date: 2026-05-25
tags:
- Vegan Cooking
- Food and Beverage
imageURL: /img/ranch/vegan-ranch-dressing.webp
imageAlt: My hand holding a bottle of vegan ranch dressing labeled with blue tape.
mastodon_id: "116638231076499180"
---
If, like me, you have ever lived in the U.S.A., and if, like me, you are of a sufficiently distinguished BMI so as to rank highly the invention of comestibles, you will agree[^1] that Ranch (enPR: rāyŭnch) dressing is one of the great American inventions—right up there with the cotton gin, surgical anesthesia, and the modern assembly line.
[![My hand holding a bottle of vegan ranch dressing labeled with blue tape.](/img/ranch/vegan-ranch-dressing.webp "This bottle is about half empty already.")](/img/ranch/vegan-ranch-dressing.webp)
For those unfamiliar with the condiment, Ranch dressing is a tangy, herbaceous, and unsettlingly white sauce of moderate viscosity intended for use as a salad dressing. In practice, it is also used as a dip for everything from fresh vegetables to fried foods, and a general purpose condiment that you might find in or on anything from pizzas to sandwiches. These days, Ranch dressing is essentially a cool, green-flecked, less-sweet alternative to ketchup, only limited in its uses by your imagination. The flavor is peculiar. It's creamy, tangy, savory, and herbal all at once in a way that is all its own. Is it any good? Here's what Dan Howell of the internet's most famous gaslighting gay couple had to say about it:
<figure><div style="position: relative; padding-top: 56.25%;"><iframe title="Dan on Ranch dressing, from @rosegoldphil on TikTok" width="100%" height="100%" src="https://makertube.net/videos/embed/owfr1z6dBtLTWkgNYKoHFa" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups allow-forms" style="position: absolute; inset: 0px;"></iframe></div><figcaption>They could hide their relationship for sixteen years, but nothing could obscure Dans love of Ranch dressing.</figcaption></figure>
I've been vegan for some twelve years now, and store-bought vegan ranch dressing is unfortunately expensive and rarely scratches the itch for me anyway. Dry Ranch seasoning mixes usually contain dairy, so they're out of the question. Surprisingly, even if this were an affordable avenue, not a single vegan restaurant in the city of Chicago seems to have a decent Ranch dressing either, so I set out to see whether the carnists might have a recipe that I could adapt. I landed on [a homemade Ranch seasoning mix recipe from The Pioneer Woman](https://www.thepioneerwoman.com/food-cooking/recipes/a91701/homemade-ranch-seasoning-mix/). The recipe helpfully includes instructions for making a dressing from the mix, which I also adapted. Making it is easy. Simply whisk together the following dry ingredients:
|Qty|Unit|Ingredient|
|--|--|--|
|1|Tbsp|Dried Parsley|
|2|tsp|Dried Dill|
|1|tsp|Dried Chives|
|1|Tbsp|Garlic Powder|
|1/2|tsp|Ground Black Pepper|
|n/a|n/a|MSG to Taste|
|1|Tbsp|Onion Powder|
|n/a|n/a|Salt to Taste|
then whisk the mixture with these wet ingredients until well combined:
|Qty|Unit|Ingredient|
|--|--|--|
|1/4|cup|Lemon Juice|
|1|cup|Vegan Mayonnaise|
|2/3|cup|Vegan Sour Cream|
|3/4|cup|Water|
Now store your homemade vegan Ranch dressing in the fridge, and use it within five days. I'm sure this won't present a challenge.
[^1]: By continuing readers agree to indemnify, defend, and hold the author harmless from any and all claims arising from or related to neck sprains and other injuries sustained through vigorous nodding in agreement.

View File

@@ -0,0 +1,70 @@
---
title: "Re: What Would You Do if You Didn't Have to Work?"
description: "Oh the lives we could lead without capitalism in the way."
date: 2026-05-18
tags:
- Life
- Quick Thoughts
synopsis: "Oh the lives we could lead without capitalism in the way."
imageURL: /img/what-would-you-do-if-you-didnt-have-to-work/ducc.webp
imageAlt: "A close up shot of a well fed mallard with a shiny green head bobbing about in the Chicago River."
mastodon_id: "116596651947015321"
---
In response to [this recent post](https://gary.onl/what-would-you-do-if-you-didnt-have-to-work/) by [gary online](https://gary.onl/): I am *absolutely* not someone who derives their worth or identity by what they do
to earn a crust. If I didn't have to work, I'd lead a richness of life that
would put to shame both the wastrels[^1] of ~~inherited~~ *stolen* means who live by
the labor of others, and the wealthy denizens of the c-suite who earn their
exorbitant salaries by becoming professional whip-crackers for the former. Here
are a few things I'd like to do.
[![A close up shot of a well fed mallard with a shiny green head bobbing about in the Chicago River.](/img/what-would-you-do-if-you-didnt-have-to-work/ducc.webp "This fellow would be well fed for a start.")](/img/what-would-you-do-if-you-didnt-have-to-work/ducc.webp)
- Learn
[Launy Grøndahl's Trombone Concerto](https://www.youtube.com/watch?v=AY8VJ6n83Qs&list=RDAY8VJ6n83Qs&start_radio=1)
so well I could play it in the middle of a battlefield.
- Finally get around to learning tenor clef in order to be able to do so.
- Cook for people: great big trays of vegan mac and cheese, spaghetti squash
with all sorts of sauces, coconut curries, baked beans, cornbread, teriyaki,
pizzas, burgers in homemade pretzel rolls, foccacia with olive oil and
balsamic vinegar for dipping, crunchy palmiers, millionaire's shortbread, tablet,
dosa, sambar, kale salads with pickled vegetables and crispy tofu, orange
faux chicken, seitan deli meats and country-fried steaks, biscuits and
"sausage" gravy, and more.
- Learn to make stovies, vegan haggis, peshwari naan, and sourdough bread, and
other delicious things.
- Get really good at programming.
- Learn C++ so that I can contribute code to open source projects like
[Scribus](https://www.scribus.net/), [Inkscape](https://inkscape.org/), and
[KDE](https://kde.org/).
- Focus on my health and fitness.
- Go to college and/or university, something I never had the chance to do, and
learn about psychology, computer science, music, mathematics, statistics,
design, and electrical engineering.
- Take courses for the fun of learning something new.
- Write more.
- Spend more time with my partner.
- Spend more time socializing.
- Go on more walks.
- Feed peas to the ducks on the river more days than not.
- Make more incense.
- Get really good at making incense.
- Try my hand at enfleurage
- Learn perfumery.
- Take a first-aid course.
- Design signage and informational material for public benefit.
- Get back into welding.
- Attempt to make soap.
- Lay in the grass on sunny days drinking shandy and eating vegan cheese and
crackers.
- Get my Spanish into shape.
- Learn German.
- Learn more Scots. Maybe write something in it.
- Write music.
- Wile away afternoons in cafés drinking tea.
- Search for resins and local aromatics.
- Take the bus to different towns just to walk around.
- Read more books.
- Not worry about what time it is.
[^1]: You ever meet one of those modern Bertie Wooster types? It's all bottle service, trips to Dubai, and overpriced yet under-seasoned lunches. Wealth truly is wasted on the wealthy.

View File

@@ -1,20 +1,18 @@
--- ---
layout: layouts/base.njk layout: layouts/base.njk
title: Nathan Upchurch | Blogroll title: Nathan Upchurch | Blogroll
tags:
- blogroll
- tagList
structuredData: none structuredData: none
h1: Blogroll
includeTOC: true
--- ---
<h1>Blogroll</h1> <p class="nodropcap">Here are some blogs and independent news outlets I like to read. You can click the RSS icon next to each to subscribe using <a href="../about-feeds/">your newsreader</a>, or import all of them at once by downloading and importing this convenient <a href="./nathanUpchurchBlogroll.opml" download>.opml file</a>.</p>
<p class="nodropcap">Here are some blogs and independent news outlets I like to read. You can click the RSS icon next to each to subscribe using <a href="../about-feeds/">your newsreader</a>, or import all of them at once by downloading and importing this convenient <a href="./nathanUpchurchBlogroll.opml" download>.opml file</a>.</p>
<p class="page-block">
<em>Skip to category:
{% for category in blogroll.categories %}
<a href="#{{ category.name | slugify }}">{{ category.name }}</a>{% if loop.last %}.{% else %},{% endif %}
{% endfor %}
</em></p>
{% for category in blogroll.categories %} {% for category in blogroll.categories %}
<section class="blogroll"> <section class="blogroll">
<h2 id="{{ category.name | slugify }}">{{ category.name }}:<a class="header-anchor" href="#{{ category.name | slugify }}">#</a></h2> <h2 id="{{ category.name | slugify }}">{{ category.name }}<a class="header-anchor" href="#{{ category.name | slugify }}">#</a></h2>
{% for blog in category.blogs %} {% for blog in category.blogs %}
<div class="blogroll-category-group"> <div class="blogroll-category-group">
<a href="{{ blog.url }}"><h3>{{ blog.title }}</h3></a> <a href="{{ blog.url }}"><h3>{{ blog.title }}</h3></a>
@@ -33,4 +31,4 @@ structuredData: none
</div> </div>
{% endfor %} {% endfor %}
</section> </section>
{% endfor %} {% endfor %}

View File

@@ -2,10 +2,63 @@
layout: layouts/base.njk layout: layouts/base.njk
title: Nathan Upchurch | Changelog title: Nathan Upchurch | Changelog
structuredData: none structuredData: none
h1: Changelog
includeTOC: true
--- ---
# Changelog ## 2026
### May
* 2026-05-26
* Updated [blogroll](/blogroll).
* Updated [/links](/links).
* 2026-05-15
* Updated [/links](/links).
* 2026-05-12
* Implement pet bird in settings.
* Refactor settings implementation. As a result:
* Weather now no longer active by default for users with JavaScript disabled.
* Settings check-boxes are disabled when the site has a hard setting default which ignores user preferences (such as in the case of the [Woo-Woo Incense Description Generator](/special/woo-woo-incense-description-generator/) page, which should always have woo-mode enabled).
* 2026-05-03
* Updated [/incense](/incense).
### April
* 2026-04-27
* Improved the appearance of the site settings modal and backdrop, including a nice fade-in effect.
* 2026-04-26
* Updated [/incense](/incense).
* Updated weather to cherry blossoms for spring.
* 2026-04-23
* Updated [/referrals](/referrals).
* Updated [/links](/links).
* Updated [/incense](/incense).
* 2026-04-20
* Updated [/links](/links).
* 2026-04-17
* Added tables of contents to list pages where it makes sense.
* Refactored CSS so that unnecessary styles are not loaded on every page.
* 2026-04-16
* Updated [/incense](/incense).
* Some type styling changes.
* 2026-04-15
* Updated [/incense](/incense).
* Updated [/not-amazon](/not-amazon).
* 2026-04-07
* Updated [/wish](/wish).
### March
* 2026-03-16
* Updated [/incense](/incense).
* Updated [/links](/links).
* Updated [/not-amazon](/not-amazon).
* 2026-03-12
* Added [/not-amazon](/not-amazon) page.
* 2026-03-11
* Implemented [search](/search).
* 2026-03-06
* Updated [/incense](/incense).
* 2026-03-05 * 2026-03-05
* Updated [/wish](/wish) and [/incense](/incense). * Updated [/wish](/wish) and [/incense](/incense).
### February
* 2026-02-07 * 2026-02-07
* Updated [/wish](/wish). * Updated [/wish](/wish).
* 2026-02-04 * 2026-02-04
@@ -14,6 +67,8 @@ structuredData: none
* Implement togglable site-wide Woo-Mode™ in site settings. * Implement togglable site-wide Woo-Mode™ in site settings.
* 2026-02-01 * 2026-02-01
* Added [Woo-Woo Incense Description Generator](/special/woo-woo-incense-description-generator). * Added [Woo-Woo Incense Description Generator](/special/woo-woo-incense-description-generator).
### January
* 2026-01-21 * 2026-01-21
* Updated [blogroll](/blogroll). * Updated [blogroll](/blogroll).
* 2026-01-16 * 2026-01-16
@@ -34,6 +89,9 @@ structuredData: none
* Updated [/sitemap](/sitemap). * Updated [/sitemap](/sitemap).
* Organized site source files. * Organized site source files.
* Added estimated read time to blog posts with [a neat plugin](https://www.npmjs.com/package/@11tyrocks/eleventy-plugin-emoji-readtime). * Added estimated read time to blog posts with [a neat plugin](https://www.npmjs.com/package/@11tyrocks/eleventy-plugin-emoji-readtime).
## 2025
### December
* 2025-12-16 * 2025-12-16
* Updated [/links](/links). * Updated [/links](/links).
* 2025-12-08 * 2025-12-08
@@ -42,6 +100,8 @@ structuredData: none
* Added [/ai](/ai) [slashpage](https://slashpages.net/) a la [the /ai 'manifesto'](https://www.bydamo.la/p/ai-manifesto). * Added [/ai](/ai) [slashpage](https://slashpages.net/) a la [the /ai 'manifesto'](https://www.bydamo.la/p/ai-manifesto).
* Added [/blank](/blank) [slashpage](https://slashpages.net/). * Added [/blank](/blank) [slashpage](https://slashpages.net/).
* Added [/referrals](/referrals) [slashpage](https://slashpages.net/). * Added [/referrals](/referrals) [slashpage](https://slashpages.net/).
### November
* 2025-11-28 * 2025-11-28
* Added styling for [guestbook](/guestbook) replies now that [the reply feature](https://codeberg.org/meadowingc/guestbooks/issues/25) is live. * Added styling for [guestbook](/guestbook) replies now that [the reply feature](https://codeberg.org/meadowingc/guestbooks/issues/25) is live.
* The [main RSS feed](/feed/feed.xml) now includes [now](/now) entries. * The [main RSS feed](/feed/feed.xml) now includes [now](/now) entries.
@@ -54,6 +114,8 @@ structuredData: none
* Updated [/incense](/incense). * Updated [/incense](/incense).
* Added snow / weather, and site settings button and dialog. * Added snow / weather, and site settings button and dialog.
* Added [/links](/links). * Added [/links](/links).
### October
* 2025-10-20 * 2025-10-20
* Added [Moist Poetry Journal](https://moistpoetryjournal.com) to the [blogroll](/blogroll). * Added [Moist Poetry Journal](https://moistpoetryjournal.com) to the [blogroll](/blogroll).
* Removed some less active and/or abandoned blogs from the [blogroll](/blogroll). * Removed some less active and/or abandoned blogs from the [blogroll](/blogroll).
@@ -67,10 +129,14 @@ structuredData: none
* Created [/incense](/incense). * Created [/incense](/incense).
* Added "not by AI" badge. * Added "not by AI" badge.
* Updated [/sitemap](/sitemap). * Updated [/sitemap](/sitemap).
### August
* 2025-08-22 * 2025-08-22
* Updated [/wish](/wish). * Updated [/wish](/wish).
* 2025-08-14 * 2025-08-14
* Implemented a [guestbook](/guestbook/). * Implemented a [guestbook](/guestbook/).
### July
* 2025-07-29 * 2025-07-29
* Added [The 74](https://www.the74million.org/) to the [blogroll](/blogroll). * Added [The 74](https://www.the74million.org/) to the [blogroll](/blogroll).
* 2025-07-14 * 2025-07-14
@@ -84,6 +150,8 @@ structuredData: none
* Added [Toxel](https://www.toxel.com/) to the [blogroll](/blogroll). * Added [Toxel](https://www.toxel.com/) to the [blogroll](/blogroll).
* 2025-07-02 * 2025-07-02
* Added [A Tea Addict's Journal](https://marshaln.com), [Bear Blog Discover](https://bearblog.dev/discover/), [Essence of Tea Blog](https://essenceoftea.com/blogs/blog), [Tea DB](https://teadb.org/), and [white2tea](https://white2tea.com/blogs/blog) to the [blogroll](/blogroll). * Added [A Tea Addict's Journal](https://marshaln.com), [Bear Blog Discover](https://bearblog.dev/discover/), [Essence of Tea Blog](https://essenceoftea.com/blogs/blog), [Tea DB](https://teadb.org/), and [white2tea](https://white2tea.com/blogs/blog) to the [blogroll](/blogroll).
### June
* 2025-06-26 * 2025-06-26
* Added [Justine the Incenseur](https://justinetheincenseur.substack.com) to the [blogroll](/blogroll). * Added [Justine the Incenseur](https://justinetheincenseur.substack.com) to the [blogroll](/blogroll).
* 2025-06-24 * 2025-06-24
@@ -92,6 +160,8 @@ structuredData: none
* Added [Freethought Blogs](https://freethoughtblogs.com/) and [Cwyn's Death by Tea](https://deathbytea.blogspot.com/) to the [blogroll](/blogroll). * Added [Freethought Blogs](https://freethoughtblogs.com/) and [Cwyn's Death by Tea](https://deathbytea.blogspot.com/) to the [blogroll](/blogroll).
* 2025-06-06 * 2025-06-06
* Implement [/now-burning](/now-burning/) and [/once-burned](/once-burned/). * Implement [/now-burning](/now-burning/) and [/once-burned](/once-burned/).
### April
* 2025-04-19 * 2025-04-19
* Improve post list image sizing on mobile. * Improve post list image sizing on mobile.
* 2025-04-08 * 2025-04-08
@@ -100,6 +170,8 @@ structuredData: none
* Updated the [colophon](/about/colophon/). * Updated the [colophon](/about/colophon/).
* 2025-04-03 * 2025-04-03
* Added [Graphic Rage with Aubrey Hirsch](https://aubreyhirsch.substack.com/) and [Usermag](https://www.usermag.co/) to the [blogroll](/blogroll). * Added [Graphic Rage with Aubrey Hirsch](https://aubreyhirsch.substack.com/) and [Usermag](https://www.usermag.co/) to the [blogroll](/blogroll).
### March
* 2025-03-28 * 2025-03-28
* Updated header on [/tags/](/tags/). * Updated header on [/tags/](/tags/).
* 2025-03-27 * 2025-03-27
@@ -110,6 +182,8 @@ structuredData: none
* Removed [Kevin Drum's blog](https://jabberwocking.com/) from the [blogroll](/blogroll) in light of [his passing](https://jabberwocking.com/health-update-100/) on the seventh of March, 2025. Rest in peace, Kevin. * Removed [Kevin Drum's blog](https://jabberwocking.com/) from the [blogroll](/blogroll) in light of [his passing](https://jabberwocking.com/health-update-100/) on the seventh of March, 2025. Rest in peace, Kevin.
* 2025-03-11 * 2025-03-11
* Updated [/wish](/wish). * Updated [/wish](/wish).
### February
* 2025-02-21 * 2025-02-21
* Updated [/wish](/wish) again as my mum bought me some incense sticks for my birthday. * Updated [/wish](/wish) again as my mum bought me some incense sticks for my birthday.
* 2025-02-20 * 2025-02-20
@@ -131,6 +205,8 @@ structuredData: none
* Add "image" meta tag for all pages, using either the image specified for the page / post, or my smiling face as a default. * Add "image" meta tag for all pages, using either the image specified for the page / post, or my smiling face as a default.
* Fix issue with metadata output on gallery image pages. * Fix issue with metadata output on gallery image pages.
* Stopped bundling CSS and injecting it into pages as I was sick of 1,000 lines of CSS on *every single page* (My build times are now a third of what they were). * Stopped bundling CSS and injecting it into pages as I was sick of 1,000 lines of CSS on *every single page* (My build times are now a third of what they were).
### January
* 2025-01-31 * 2025-01-31
* Update the copyright notice in the footer. * Update the copyright notice in the footer.
* 2025-1-29 * 2025-1-29
@@ -144,6 +220,9 @@ structuredData: none
* Prettier date formatting throughout. * Prettier date formatting throughout.
* 2025-1-13 * 2025-1-13
* Added [Popular Information](https://popular.info/) to the [blogroll](/blogroll). * Added [Popular Information](https://popular.info/) to the [blogroll](/blogroll).
## 2024
### December
* 2024-12-16 * 2024-12-16
* Update PeerTube instance on [/me](/me). * Update PeerTube instance on [/me](/me).
* 2024-12-15 * 2024-12-15
@@ -157,4 +236,3 @@ structuredData: none
* Added [Aftermath](https://aftermath.site/) to the [blogroll](/blogroll). * Added [Aftermath](https://aftermath.site/) to the [blogroll](/blogroll).
* Implemented [/changelog](/changelog) 🎉. * Implemented [/changelog](/changelog) 🎉.
* Implemented [/ai](/ai) a la [slashai.page](https://slashai.page/). * Implemented [/ai](/ai) a la [slashai.page](https://slashai.page/).

View File

@@ -4,6 +4,8 @@ pagination:
size: 1 size: 1
alias: picture alias: picture
layout: layouts/base.njk layout: layouts/base.njk
tags:
- galleryImage
structuredData: none structuredData: none
eleventyComputed: eleventyComputed:
imageURL: "{{ picture.baseUrl }}/{{ picture.filename }}" imageURL: "{{ picture.baseUrl }}/{{ picture.filename }}"
@@ -11,20 +13,20 @@ eleventyComputed:
permalink: "/gallery/{{ picture.containingGallery | slugify }}/{{ picture.filename | slugify }}/" permalink: "/gallery/{{ picture.containingGallery | slugify }}/{{ picture.filename | slugify }}/"
description: "{{ picture.title }} from gallery: {{ picture.containingGallery}}" description: "{{ picture.title }} from gallery: {{ picture.containingGallery}}"
--- ---
<article> <article data-pagefind-body>
<h1>{{ picture.title }}</h1> <h1>{{ picture.title }}</h1>
<div class="buttonContainer galleryButtons"> <div class="buttonContainer galleryButtons">
{% if picture.previousImage %} {% if picture.previousImage %}
<a href="../{{ picture.previousImage | slugify }}"> <a href="../{{ picture.previousImage | slugify }}">
<button type="button">Previous</button> <button type="button">Previous</button>
</a> </a>
{% endif %} {% endif %}
<a href="/gallery/{{ picture.containingGallery | slugify }}/"> <a href="/gallery/{{ picture.containingGallery | slugify }}/">
<button type="button">Gallery</button> <button type="button">🕮 Gallery</button>
</a> </a>
{% if picture.nextImage %} {% if picture.nextImage %}
<a href="../{{ picture.nextImage | slugify }}"> <a href="../{{ picture.nextImage | slugify }}">
<button type="button">Next</button> <button type="button">Next</button>
</a> </a>
{% endif %} {% endif %}
</div> </div>

View File

@@ -4,16 +4,20 @@ pagination:
size: 1 size: 1
alias: gallery alias: gallery
layout: layouts/base.njk layout: layouts/base.njk
tags: gallery tags:
- gallery
- galleryImage
structuredData: none structuredData: none
eleventyExcludeFromCollections: true
eleventyComputed: eleventyComputed:
title: "{{ gallery.title }}" title: "{{ gallery.title }}"
permalink: "/gallery/{{ gallery.title | slugify }}/" permalink: "/gallery/{{ gallery.title | slugify }}/"
description: "{{ gallery.description }}" description: "{{ gallery.description }}"
--- ---
<h1>{{ gallery.title }}</h1> <div data-pagefind-body>
<p class="page-block nodropcap">{{ gallery.description }}</p> <h1>{{ gallery.title }}</h1>
<section class="gallery-images"> <p class="page-block nodropcap">{{ gallery.description }}</p>
<section class="gallery-images">
{% for picture in gallery.pictures %} {% for picture in gallery.pictures %}
<a href="/gallery/{{ gallery.title | slugify }}/{{ picture.filename | slugify }}/"> <a href="/gallery/{{ gallery.title | slugify }}/{{ picture.filename | slugify }}/">
<wc-card class="gallery-image-container"> <wc-card class="gallery-image-container">
@@ -21,4 +25,5 @@ eleventyComputed:
</wc-card> </wc-card>
</a> </a>
{% endfor %} {% endfor %}
</section> </section>
</div>

View File

@@ -1,8 +1,13 @@
--- ---
layout: layouts/base.njk layout: layouts/base.njk
tags:
- metadata
- postList
--- ---
<h1>My image galleries.</h1> <div data-pagefind-body>
<p class="page-block nodropcap"> <h1>My image galleries</h1>
Photography trips, memes, and other pictures I thought would be worth sharing. <p class="page-block nodropcap">
</p> Photography trips, memes, and other pictures I thought would be worth sharing.
{% include "gallerieslist.njk" %} </p>
{% include "gallerieslist.njk" %}
</div>

View File

@@ -2,6 +2,8 @@
layout: layouts/base.njk layout: layouts/base.njk
title: Nathan Upchurch | Guestbook title: Nathan Upchurch | Guestbook
structuredData: none structuredData: none
tags:
- guestbook
--- ---
<h1>Sign My Guestbook</h1> <h1>Sign My Guestbook</h1>
<!-- Guestbook Script --> <!-- Guestbook Script -->

View File

@@ -2,9 +2,9 @@
layout: layouts/base.njk layout: layouts/base.njk
title: Nathan Upchurch | Incense title: Nathan Upchurch | Incense
structuredData: none structuredData: none
includeTOC: true
h1: "Incense: Writing & Resources"
--- ---
# Incense: Writing & Resources
::: info ::: info
For my writing on incense see [the incense tag page](/tags/incense). Is this page missing something? [Let me know](/me). For my writing on incense see [the incense tag page](/tags/incense). Is this page missing something? [Let me know](/me).
::: :::
@@ -25,12 +25,15 @@ Incense making is hard. While parts of the world with strong incense cultures en
### Resources ### Resources
* [/r/incense posts flaired with "incense making"](https://www.reddit.com/r/Incense/?f=flair_name%3A%22Incense%20Making%22)—For better or worse, the incense subreddit is *the* place to go for incense discussion and advice. I'm working on changing that, but it's slow-going; see the forums / discussion boards section below. * [/r/incense posts flaired with "incense making"](https://www.reddit.com/r/Incense/?f=flair_name%3A%22Incense%20Making%22)—For better or worse, the incense subreddit is *the* place to go for incense discussion and advice. I'm working on changing that, but it's slow-going; see the forums / discussion boards section below.
* [incensemaking.com](https://incensemaking.com/)—A useful site, particularly for listing many of the aromatics used in incense making. Be careful, however, as not all of the ingredients listed may be suited for [combustible incense](https://en.wikipedia.org/wiki/Incense#Types). * [incensemaking.com](https://incensemaking.com/)—A useful site, particularly for listing many of the aromatics used in incense making. Be careful, however, as not all of the ingredients listed may be suited for [combustible incense](https://en.wikipedia.org/wiki/Incense#Types).
* [Jarguna Incense YouTube playlist](https://www.youtube.com/watch?v=ZzPT3nU1j70&list=PLWogy1GQgvfECuf-F3kIrsuiBFXh1ctNr&index=1)
* [The Incense Dragon YouTube channel](https://www.youtube.com/c/IncenseDragon) * [The Incense Dragon YouTube channel](https://www.youtube.com/c/IncenseDragon)
## Advanced Incense Making Techniques ## Advanced Incense Making Techniques
### Articles ### Articles
* [*Enfleurage an Esoteric and Ancient Art*, Be-en-Foret](https://mermadearts.com/i/enfleurage-an-esoteric-and-ancient-art)
* [*Filtering Conifer Resins*, Dave of The World Makes Scents](https://incensemakers.org/d/20-filtering-conifer-resins) * [*Filtering Conifer Resins*, Dave of The World Makes Scents](https://incensemakers.org/d/20-filtering-conifer-resins)
* [*Incorporating Soft Resin Into Your Incense Recipe*, Dave of The World Makes Scents](https://incensemakers.org/d/26-incorporating-soft-resin-into-your-incense-recipe) * [*Incorporating Soft Resin Into Your Incense Recipe*, Dave of The World Makes Scents](https://incensemakers.org/d/26-incorporating-soft-resin-into-your-incense-recipe)
* [*Powder Enfleurage! An Ancient Fragrant Art*, Anyas Garden Perfumes](https://anyasgarden.com/powder-enfleurage-ancient-fragrant-art-giveaway/)
* [*Traditional Processing of Aloeswood*, Dr. Incense](https://dr-incense.com/blogs/dr-incense-blog/traditional-processing-of-aloeswood) * [*Traditional Processing of Aloeswood*, Dr. Incense](https://dr-incense.com/blogs/dr-incense-blog/traditional-processing-of-aloeswood)
* [*Washing Frankincense*, Nathan Upchurch](/blog/washing-frankincense/) * [*Washing Frankincense*, Nathan Upchurch](/blog/washing-frankincense/)
@@ -39,10 +42,13 @@ Incense making is hard. While parts of the world with strong incense cultures en
## Writing on Incense and Related Topics ## Writing on Incense and Related Topics
### Articles ### Articles
* [A New Incense Bibliography Part 1: History & Art, Incense Apprentice](https://incenseapprentice.substack.com/p/a-new-incense-bibliography-part-1) * [*A New Incense Bibliography Part 1*: History & Art, Incense Apprentice](https://incenseapprentice.substack.com/p/a-new-incense-bibliography-part-1)
* [A New Incense Bibliography Part 2: Worldwide Incense Traditions, Incense Apprentice](https://incenseapprentice.substack.com/p/a-new-incense-bibliography-part-2) * [*A New Incense Bibliography Part 2*: Worldwide Incense Traditions, Incense Apprentice](https://incenseapprentice.substack.com/p/a-new-incense-bibliography-part-2)
* [Ancient Chinese kneaded incense recipes translated from Zhou Jiaxuan's *History of Incense* (香乘 / xiāng shèng)](https://web.archive.org/web/20230216230731/https://talesofincense.com/scent-materia/) * [Ancient Chinese kneaded incense recipes translated from Zhou Jiaxuan's *History of Incense* (香乘 / xiāng shèng)](https://web.archive.org/web/20230216230731/https://talesofincense.com/scent-materia/)
* [*Bakhour (Turaren Wuta) In Nigeria*, Dr Ruqayya Abba Tofa](https://www.fragrantica.com/news/Bakhour-Turaren-Wuta-In-Nigeria-21456.html)
* [*Bakhour (Turaren Wuta) in Nigeria (Part 2)*, Dr Ruqayya Abba Tofa](https://www.fragrantica.com/news/Bakhour-Turaren-Wuta-in-Nigeria-Part-2-21989.html)
* [Chinese incense ingredient name translations](https://web.archive.org/web/20230216230731/https://talesofincense.com/scent-materia/) * [Chinese incense ingredient name translations](https://web.archive.org/web/20230216230731/https://talesofincense.com/scent-materia/)
* [*Goose Pear Tent Incense*, Be-en-Foret](https://mermadearts.com/i/chinese-goose-pear-tent-incense)
* [*Japanese Incense Types*, Kyarazen](https://www.kyarazen.com/japanese-incense-types-in-modern-day/) * [*Japanese Incense Types*, Kyarazen](https://www.kyarazen.com/japanese-incense-types-in-modern-day/)
* [*Pressed Incense Tablets*, Kyarazen](https://www.kyarazen.com/pressed-incense-tablets/) * [*Pressed Incense Tablets*, Kyarazen](https://www.kyarazen.com/pressed-incense-tablets/)
* [*The Wisdom of Traditional Processing Methods*, Dr. Incense](https://dr-incense.com/blogs/dr-incense-blog/the-wisdom-of-traditional-processing-methods) * [*The Wisdom of Traditional Processing Methods*, Dr. Incense](https://dr-incense.com/blogs/dr-incense-blog/the-wisdom-of-traditional-processing-methods)
@@ -93,13 +99,17 @@ Incense making is hard. While parts of the world with strong incense cultures en
* [Mothers Goods (Germany)](https://mothersgoods.com)—Herbs, Resins, Woods * [Mothers Goods (Germany)](https://mothersgoods.com)—Herbs, Resins, Woods
* [Mountain Rose Herbs (USA)](https://mountainroseherbs.com/)—Extracts, Herbs, Tinctures, Oils, Resins * [Mountain Rose Herbs (USA)](https://mountainroseherbs.com/)—Extracts, Herbs, Tinctures, Oils, Resins
* [New Mountain Merchants (Australia)](https://newmountain.com.au/)—Oils, Woods * [New Mountain Merchants (Australia)](https://newmountain.com.au/)—Oils, Woods
* [ResinaeBotanica (UK)](https://www.etsy.com/shop/ResinaeBotanica)—Resins
* [Scents of Earth (USA)](https://scents-of-earth.com/)—Absolutes, Herbs, Oils, Resins, Woods * [Scents of Earth (USA)](https://scents-of-earth.com/)—Absolutes, Herbs, Oils, Resins, Woods
* [Tame the Spirit Herbs (USA)](https://tamethespiritherbs.com/)—Herbs, Resins, Woods
* [The Incense Dragon (USA)](https://www.theincensedragon.com/supplies)—Herbs, Resins, Woods * [The Incense Dragon (USA)](https://www.theincensedragon.com/supplies)—Herbs, Resins, Woods
* [The World Makes Scents (USA)](https://theworldmakesscents.com/)—Herbs, Resins, Woods * [The World Makes Scents (USA)](https://theworldmakesscents.com/)—Herbs, Resins, Woods
* [Youherbit (Greece)](https://www.youherbit.com/)—Herbs, Resins, Woods
## Studies on Incense and Related Topics ## Studies on Incense and Related Topics
* [*Odor Tenacity of Perfumery Materials*, Hayato Hosokawa and Takayuki Shibamoto](https://web.archive.org/web/20240616105228/https://img.perfumerflavorist.com/files/base/allured/all/document/2016/04/pf.7775.pdf) * [*Key Issues and Challenges in Spice Grinding*, HPramod P. Aradwad, Arun Kumar T V, P.K. Sahoo, Indra Mani (PDF, 3.7 MiB)](/documents/key_issues_and_challenges_in_spice_grinding.pdf)
* [*Odor Tenacity of Perfumery Materials*, Hayato Hosokawa and Takayuki Shibamoto (PDF, 158.8 KiB)](/documents/odor_tenacity_of_perfume_materials.pdf)
## Forums / Discussion Boards ## Forums / Discussion Boards
* [Reddit (/r/incense)](https://reddit.com/r/incense)—Unfortunately, this is currently *the* place to discuss incense and incense making on the English-speaking internet. If you would like to avoid a platform that spies on you and uses your writing to train AI, you are welcome to help me bring some life to the following alternative option (currently pretty much only populated by me): * [Reddit (/r/incense)](https://reddit.com/r/incense)—Unfortunately, this is currently *the* place to discuss incense and incense making on the English-speaking internet. If you would like to avoid a platform that spies on you and uses your writing to train AI, you are welcome to help me bring some life to the following alternative option (currently pretty much only populated by me):
@@ -108,6 +118,7 @@ Incense making is hard. While parts of the world with strong incense cultures en
* [The Incense Makers' Guild](https://incensemakers.org/)—An invitation-only forum for experienced incense makers hosted by yours truly. Currently pretty quiet, but some good info can be found there already. * [The Incense Makers' Guild](https://incensemakers.org/)—An invitation-only forum for experienced incense makers hosted by yours truly. Currently pretty quiet, but some good info can be found there already.
## Fun ## Fun
* [Incense Ingredient Quiz](/quizzes/incense-ingredient-quiz/)
* [Woo-Woo Incense Description Generator](/special/woo-woo-incense-description-generator) * [Woo-Woo Incense Description Generator](/special/woo-woo-incense-description-generator)

View File

@@ -1,7 +1,4 @@
--- ---
layout: layouts/home.njk layout: layouts/home.njk
eleventyNavigation:
key: Home
order: 1
--- ---
{% include "navigator.njk" %} {% include "navigator.njk" %}

View File

@@ -2,16 +2,21 @@
layout: layouts/base.njk layout: layouts/base.njk
title: Nathan Upchurch | Links title: Nathan Upchurch | Links
structuredData: none structuredData: none
h1: Links
includeTOC: true
--- ---
# Links
Here are some links to pages and resources that I believe are worth sharing. Here are some links to pages and resources that I believe are worth sharing.
## Design tools and resources ## Creative resources
### Education ### General
* [Creazilla](https://creazilla.com/)—A huge collection of media files under a Public Domain license including photos, illustrations, scanned art images, vectors, videos, and audio files.
* [Pixabay](https://pixabay.com/)—Free stock photos, illustrations, vector graphics, videos, music and sounds effects.
### Graphic Design
#### Education
* [Buttericks Practical Typography](https://practicaltypography.com/) * [Buttericks Practical Typography](https://practicaltypography.com/)
### Reference #### Reference
* [Design Systems Gallery](https://designsystemsrepo.com/design-systems-recent/) * [Design Systems Gallery](https://designsystemsrepo.com/design-systems-recent/)
### Software #### Software
* [Converseen](https://converseen.fasterland.net/)—A Batch Image Converter and Resizer Tool for Windows, Linux and macOS * [Converseen](https://converseen.fasterland.net/)—A Batch Image Converter and Resizer Tool for Windows, Linux and macOS
* [darktable](https://www.darktable.org/)—An open source photography workflow application and raw developer * [darktable](https://www.darktable.org/)—An open source photography workflow application and raw developer
* [digiKam](https://www.digikam.org/)—Open-source digital asset manager and image editor * [digiKam](https://www.digikam.org/)—Open-source digital asset manager and image editor
@@ -22,16 +27,18 @@ Here are some links to pages and resources that I believe are worth sharing.
* [Krita](https://krita.org/en/)—A professional FLOSS painting and raster editing tool * [Krita](https://krita.org/en/)—A professional FLOSS painting and raster editing tool
* [RawTherapee](https://www.rawtherapee.com/)—A free, cross-platform raw image processing program * [RawTherapee](https://www.rawtherapee.com/)—A free, cross-platform raw image processing program
* [Scribus](https://www.scribus.net/)—The Go-To Libre Desktop Publishing Application * [Scribus](https://www.scribus.net/)—The Go-To Libre Desktop Publishing Application
### Stock graphics #### Stock graphics
* [Artvee](https://artvee.com/)—Browse and download high-resolution, public domain paintings, posters and illustrations * [Artvee](https://artvee.com/)—Browse and download high-resolution, public domain paintings, posters and illustrations
* [CocoMaterial](https://cocomaterial.com/)—The Open Source hand-drawn illustration library with 3,293 images * [CocoMaterial](https://cocomaterial.com/)—The Open Source hand-drawn illustration library with 3,293 images
* [Free and open source icons](https://www.toools.design/free-open-source-icon-libraries) * [Free and open source icons](https://www.toools.design/free-open-source-icon-libraries)
* [Getty Search Gateway](https://search.getty.edu/gateway/search?q=&cat=type&r=%22Paintings%22&types=%22Paintings$Paintings%22&highlights=%22Open%20Content%20Images$Recent%20Acquisitions%22&rows=10&srt=a&dir=s&dsp=0&img=0&pg=1) * [Getty Museum Collection](https://www.getty.edu/art/collection/search?open_content=true)
* [Getty Research Collections](https://www.getty.edu/research/collections/search?is_open_content=true)
* [Museo](https://museo.app/)—A visual search engine that connects you with the Art Institute of Chicago, the Rijksmuseum, the Harvard Art Museums, the Minneapolis Institute of Art, the The Cleveland Museum of Art, and the New York Public Library Digital Collection * [Museo](https://museo.app/)—A visual search engine that connects you with the Art Institute of Chicago, the Rijksmuseum, the Harvard Art Museums, the Minneapolis Institute of Art, the The Cleveland Museum of Art, and the New York Public Library Digital Collection
* [National Gallery of Art](https://www.nga.gov/artwork-search?download=1)—Search and download from a collection of tens of thousands of artworks.
* [Pexels](https://www.pexels.com/)—The best free stock photos, royalty free images & videos shared by creators * [Pexels](https://www.pexels.com/)—The best free stock photos, royalty free images & videos shared by creators
* [Pixabay](https://pixabay.com/)—Stunning royalty-free images & royalty-free stock * [Public Domain Image Archive](https://pdimagearchive.org/galleries/all/random/desc)—The Public Domain Image Archive is a curated collection of more than 10,000 out-of-copyright historical images, free for all to explore and reuse.
* [Smithsonian Open Access](https://www.si.edu/openaccess)—Download, share, and reuse millions of the Smithsonians images * [Smithsonian Open Access](https://www.si.edu/openaccess)—Download, share, and reuse millions of the Smithsonians images
### Typefaces #### Typefaces
* [Badass Libre Fonts By Womxn](https://www.design-research.be/by-womxn/) * [Badass Libre Fonts By Womxn](https://www.design-research.be/by-womxn/)
* [Collletttivo](https://www.collletttivo.it/)—An Open-Source type foundry and a network of people promoting the practice of type design through mutual exchange and collaboration * [Collletttivo](https://www.collletttivo.it/)—An Open-Source type foundry and a network of people promoting the practice of type design through mutual exchange and collaboration
* [coolLabs Fonts](https://fonts.coollabs.io/)—A privacy-friendly drop-in replacement for Google Fonts * [coolLabs Fonts](https://fonts.coollabs.io/)—A privacy-friendly drop-in replacement for Google Fonts
@@ -136,9 +143,14 @@ Unlimited creativity, zero ads.
* [Userbar generator](https://350x19.datakra.sh/)—Generate 250x19 userbar graphics * [Userbar generator](https://350x19.datakra.sh/)—Generate 250x19 userbar graphics
## Literature ## Literature
* [Standard Ebooks](https://standardebooks.org/)—A volunteer-driven effort to produce a collection of high quality, carefully formatted, accessible, open source, and free public domain ebooks that meet or exceed the quality of commercially produced ebooks.
* [TypeLit.io](https://www.typelit.io/)—Test your typing online by practicing on your favorite literature * [TypeLit.io](https://www.typelit.io/)—Test your typing online by practicing on your favorite literature
* [Wee Windaes—A continuum o the Scots Leid](https://wee-windaes.nls.uk/) * [Wee Windaes—A continuum o the Scots Leid](https://wee-windaes.nls.uk/)
## Music
* [Free Music Archive](https://freemusicarchive.org/home)—Free Music Archive (FMA) offers free access to open licensed, original music by independent artists around the world.
* [Musopen](https://musopen.org/)—Musopen is a 501(c) 3 non-profit working to increase access to music education by providing free music recordings, sheet music, apps, and educational materials.
## Privacy-respecting tools and services ## Privacy-respecting tools and services
* [Autistici](https://www.autistici.org/)—A collective offering free digital services, including: * [Autistici](https://www.autistici.org/)—A collective offering free digital services, including:
* Anonymity services * Anonymity services
@@ -258,3 +270,8 @@ Unlimited creativity, zero ads.
* VPN * VPN
## Random cool stuff ## Random cool stuff
* [intertapes.net](https://intertapes.net/)—An updating collection of found cassette tapes from different locations. The audio fragments include: voice memos, field recordings, mixtapes, bootlegs and more. * [intertapes.net](https://intertapes.net/)—An updating collection of found cassette tapes from different locations. The audio fragments include: voice memos, field recordings, mixtapes, bootlegs and more.
* [Pocket Bird](https://idreesinc.itch.io/pocket-bird)—A pet bird that flies around web pages as you browse. Collect feathers to unlock different birds, and find hats for your bird to wear.
## Sounds & Samples
* [FreeSound](https://freesound.org/)
* [LooperMan](https://www.looperman.com/)
* [SampleSwap](https://sampleswap.org/index.php)

135
content/not-amazon/index.md Normal file
View File

@@ -0,0 +1,135 @@
---
layout: layouts/base.njk
title: "Nathan Upchurch | Not Amazon"
structuredData: none
h1: Not Amazon
includeTOC: true
---
Mostly for my own use, this is a list of U.S.-based online shops that are not Amazon. If you are looking to stop paying for J-Beezy's yacht maintenance while his workers piss in bottles, and you're based in the U.S.A., you might find this list useful too. Vegan and small independent brands get priority, of course. I do not receive any sort of commission or kick-back from any of the below stores. If you do want to buy something that I get a kick-back from, check out my (sparse) [referrals](/referrals) page. I haven't personally tried all of these retailers, so use judgment before purchasing.
## Clothing & Apparel
* [Bombas](https://bombas.com/)—Decent socks.
* [Suavs](https://www.suavshoes.com/)—Very comfortable ultra-casual shoes with a nice wide toe-box.
* [Means Workwear](https://www.meansworkwear.com/)—Clothing, patches, and hats that may get you put on a list.
* [Very Cool](https://shirtz.cool/)—Ultra casual clothing.
* [Will's Vegan Store](https://www.wills-vegan-store.com/)—Vegan faux-leather[^1] shoes, mostly smart-casual and up, plus some nice coats, jackets, and bags.
## Electronics
* [CircuitMess](https://circuitmess.com/)—STEM kits.
* [Handheld Legend](https://handheldlegend.com/)—Retro handheld console mods and upgrades.
* [Micro Center](https://www.microcenter.com/)—Computers and computer components, maker products, networking equipment, and more.
* [Minis Forum](https://www.minisforum.com/)—Mini PCs.
* [KPRepublic](https://kprepublic.com/)—Keyboards and keyboard accessories.
* [Retroid](https://www.goretroid.com/)—Handheld retro game emulation devices.
* [Slimbook](https://slimbook.com/en/)—Laptops made for GNU/Linux.
* [StarLabs](https://us.starlabs.systems/)—Computers made for GNU/Linux.
* [System76](https://system76.com/)—Computers and accessories made for GNU/Linux.
* [Tindie](https://www.tindie.com/)—Buy unique electronics directly from makers.
* [Tuxedo Computers](https://www.tuxedocomputers.com/en)—Laptops made for GNU/Linux.
* [X-Tronic USA](https://xtronicusa.com/)—Soldering stations and related items.
## Emergency Preparedness
* [Sparrows Lock Picks](https://www.sparrowslockpicks.com/)—Lock picks, sets, and escape and evasion tools.
* [Veggie Mush](https://www.veggiemush.com/)—Dried plant-based meals for camping or emergencies.
## Entertainment
* [Abe Books](https://www.abebooks.com/)—Books, fine art, and collectibles.
* [itch.io](https://itch.io/)—Indie video games.
* [Perfectly Acceptable](https://www.perfectly-acceptable.com/)—Independently published books and zines.
* [Means TV](https://means.tv/)—A TV subscription that may get you put on a list.
## Food & Beverage
### Baked Goods
* [Little Moon Bakehouse](https://littlemoonbakehouse.com/)—Vegan mooncakes and pastries.
### Groceries
* [Anthony's Goods](https://anthonysgoods.com/)—Pantry staples: flours, sugars and sweeteners, nuts and seeds, spices, and more.
* [Canaan Palestine](https://canaanpalestine.com/)—Premium olive oils from Palestine's 2,000 year old olive trees. They also carry a small selection of tapenades and other pantry items.
* [Nuts.com](https://nuts.com/)—Nuts, chocolate, sweets, trail mix, teas, flours, spices, dried fruit, and more. Don't blindly trust their vegan filter.
* [Weee!](https://www.sayweee.com/en)—America's largest online Asian supermarket. Great for vegetables and interesting stuff you won't find anywhere else.
### Non-Alcoholic
* [The Zero Proof](https://thezeroproof.com/)—Non-alcoholic beer, wine, spirits, cocktails, amaros, aperitifs, and digestifs, and more.
### Sweets
* [Alegio Chocolaté](https://www.alegio.com/)—High-end chocolate grown in São Tomé.
* [No Whey Foods](https://nowheychocolate.com/)—Vegan and kosher chocolates free from common allergens.
* [Rose City](https://rosecitychocolates.com/)—Has a wide array of (very nice) vegan chocolates.
* [Shrivers](https://shrivers.com/)—Salt water taffy that you'll actually want to eat.
### Tea
* [Spirit Tea](https://spirittea.co/)—Farm-direct loose leaf tea. Based in Chicago.
* [Yunnan Sourcing](https://yunnansourcing.us/)—A wide array of high quality teas and tea resins, including puerh.
### Vegan / Vegetarian Alternatives
* [All Vegetarian Inc.](https://veganforall.com/)—Vegan substitutes for bacon, shrimp, eggs, and more.
* [Fake Meats](https://www.fakemeats.com/default.asp)—Vegetarian and vegan meat substitutes, snacks, seasonings, sauces, jerky, and more. Seems like this store isn't totally vegan: check ingredients before buying.
* [vegefood.com](https://vegefood.com/)—All sorts of weird and wonderful vegan and vegetarian meat alternatives. Not totally vegan: check ingredients before buying.
* [WebstaurantStore](https://www.webstaurantstore.com/search/vegan.html)—If you're willing to buy by the case, you can get all sorts of vegan alternatives here on the cheap.
* [Yang Kee Trading](https://yangkeetrading.com/)—Large dried TVP chunks, slices, and strips, vegan pork floss, teas, and more.
## General
* [Public Goods](https://www.publicgoods.com/)—Simple products within the bath and body, cleaning, kitchen and dining, and home decor categories.
* [GoodEarth Products](https://goodearthproducts.com/)—Office supplies, cleaning, food service, medical, and industrial goods. Also sells the very economical 40-pound buckets of Boardwalk laundry detergent. I have hardly managed to put a dent in my bucket after sixteen months.
* [Grove](https://www.grove.co/)—Products across home and kitchen, garden, cleaning, bath and body, and more. Also sells a very affordable 3-ply bamboo toilet paper.
* [Ten Thousand Villages](https://www.tenthousandvillages.com/)—Fair trade kitchen items, soaps, handwoven baskets, games and puzzles, jewelry, and more from artisans across the world.
## Home
### Art
* [Prints: The Public Domain Review](https://publicdomainreview.org/shop/fine-art-prints/)—The Public Domain Review prints shop offers custom-made Giclée prints from a selection of more than 900 public domain images. All proceeds from sales go back into The Public Domain Review (a not-for-profit project).
### Cleaning Supplies
* [Friendswood Brooms](https://friendswoodbrooms.com/)—Handmade corn brooms.
* [Meckley Brooms](https://www.meckleybrooms.com/)—Handmade corn brooms.
### Furniture
* [Joybird](https://rigbyhandcraft.com/ornaments)—Decent quality furniture (not flat-pack) that doesn't cost the earth. They have a decent warranty, too, but do be prepared to go to battle if you intend to use it.[^2]
### Holiday Decorations
* [Rigby Handcraft](https://rigbyhandcraft.com/ornaments)—Reproductions of antique tin Christmas tree ornaments.
### Incense
* [Exotic Incense](https://www.exoticincense.com/)—Sells a wide array of incense from India, Tibet, Japan, and more.
* [Fred Soll](https://www.fredsoll.com/)—An independent U.S. incense maker who pioneered the "resin on a stick" category.
* [Goyo](https://www.goyo.space/shop)—Incense by artisan Hyungi Park.
* [Japan Incense](https://www.japanincense.com/)—Japanese incense shop with a huge selection.
* [Kikoh](https://kikohincense.com/)—Japanese incense shop that packages every order very nicely.
* [Mermade Magickal Arts](https://www.mermadearts.com/)—High-end incense from a number of independent artisans.
* [Nippon Kodo](https://nipponkodostore.com/)—The official U.S. web-store for Nippon Kodo.
* [Shoyeido](https://shoyeido.com/)—The official U.S. web-store for Shoyeido.
* [The World Makes Scents](https://theworldmakesscents.com/)—A Chicago-local independent incense brand focusing on Cambodian-style natural, whole-plant incense.
### Kitchen
* [John Boos & Co.](https://www.johnboos.com/)—High quality cutting boards, butcher blocks, carts, kitchen islands, tables, and more.
* [Made In](https://madeincookware.com/)—5-ply stainless clad cookware, cutlery, plates, bowls, and more.
* [Oxo](https://www.oxo.com/)—Kitchenware, cleaning and organization products, and more.
* [WebstaurantStore](https://www.webstaurantstore.com/)—Commercial kitchen equipment from freezers to disposable cups and janitorial supplies. This is where I got my [Boos Block prep table](https://www.johnboos.com/products/1-1-2-thick-wood-top-work-tables-with-galvanized-shelf-24-wide?Size=36%22+x+24%22+x+1-1%2F2%22) on the cheap.
### Organization
* [North Mountain Supply](https://www.northmountainsupply.com/)—Jars, bottles, and supplies for beer making, wine making, distilling, and more.
## Office
### Stationery
* [Blackwing](https://blackwing602.com/)—Home of the legendary Blackwing pencil.
* [The Goulet Pen Co.](https://www.gouletpens.com/)—Fountain pens (the environmentally friendly option!), ink, paper, stationery sets, and more.
## Personal Care
### Bath & Body
* [Ethique](https://ethique.com/)—Shampoo and conditioner bars from Aotearoa New Zealand.
* [Dr. Jen](https://drjennatural.com/)—Nano-Hydroxyapatite toothpaste. They also sell a strawberry flavor for those sensitive to mint.
* [HiBAR](https://hellohibar.com/)—Vegan and plastic free deodorant, body wash, hair care, and more.
* [J•R•Liggett's](https://jrliggett.com/)—All natural shampoo bars.
* [Palestinian Soap Cooperative](https://palestiniansoap.coop/)—Olive oil soap from Nablus, Palestine, made using a traditional process practiced for well over four millennia.
* [Phoenix Shaving](https://phoenixshaving.com/)—A wide array of razors, aftershaves, brushes, and other wet-shaving products, including the fantastic [CK-6 line of vegan shaving soaps](https://phoenixshaving.com/collections/ultra-premium-formula-ck-6).
* [Smart Life Co.](https://www.smartlifeco.com/)—Floss picks and other oral hygiene products.
* [The Earthling Co.](https://theearthlingco.com/)—Shampoo and conditioner bars.
* [TNG Worldwide](https://tngworldwide.com/)—Bulk vegan soap, shampoo, conditioner, lotion, and more from the Ginger Lily Farms brand. They also sell spa supplies and salt lamps. Ignore the "Available at Amazon" buttons.
* [Triple Bristle](https://www.triplebristle.com/)—Neat three-sided toothbrushes that really get every surface of your teeth with little effort.
### Supplements
* [Complement](https://lovecomplement.com/)—Vegan multivitamins and supplements.
* [vivanaturals](https://vivanaturals.com/)—Supplements, beauty, and food items.
[^1]: I know what you're thinking, but I have not once had any issues with peeling or damage on the faux-leather uppers from this brand (most intentionally vegan brands have this handled). In fact, they last and look good for longer than animal-skin shoes because the material is not damaged by moisture or road salt. If you really want a true buy-it-for-life option, though (and if they have them in your size), go for the Goodyear welt options so that the shoes are properly resoleable at a cobbler.
[^2]: I bought a sofa with angled legs; not the most structurally sound arrangement. When one broke, it took me years to get around to making a warranty claim. They honored it, but I first had to send the couch back. They then told me that the model I bought was no longer available, but I could select one from the website of the same value before any sales or discounts. There were two problems with this. First, years had passed and prices had risen. Second, just about everything on that website seems to be perpetually on sale. And so I went to war. There were mysterious email deliverability issues, negotiations, and many phone calls. Eventually, I got a nice new replacement couch for Sol to leave crumbs on with entirely vertical legs. Result.

View File

@@ -0,0 +1,7 @@
---
title: Warming
manufacturer: "Faircense / Pema of Tibet"
date: 2026-03-06 12:56:00
time: 12:56 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Tokusen Kobunboku
manufacturer: Baieido
date: 2026-03-12 11:43:00
time: 11:43 AM
---
I like this one a lot.

View File

@@ -0,0 +1,7 @@
---
title: Kobunboku
manufacturer: Baieido
date: 2026-03-13 13:29:00
time: 1:29 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Morning Star Lavender
manufacturer: Nippon Kodo
date: 2026-03-13 15:07:00
time: 3:07 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Suifu
manufacturer: Yamadamatsu
date: 2026-03-16 12:18:00
time: 12:18 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Shin Tokusen Reiryokoh
manufacturer: Kunmeido
date: 2026-03-18 12:27:00
time: 12:27 PM
---

View File

@@ -0,0 +1,7 @@
---
title: My Love Incense Pine
manufacturer: Nippon Kodo
date: 2026-03-18 14:07:00
time: 2:07 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Kaori No Kioku Chocolate
manufacturer: Kokando
date: 2026-03-18 15:31:00
time: 3:31 PM
---

View File

@@ -0,0 +1,7 @@
---
title: White Sage Mage
manufacturer: The World Makes Scents
date: 2026-03-19 12:01:00
time: 12:01 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Hippy Hug
manufacturer: The World Makes Scents
date: 2026-03-19 13:03:00
time: 1:03 PM
---
Sols a big fan of this one in particular.

View File

@@ -0,0 +1,7 @@
---
title: Magnifiscents Diamond
manufacturer: Shoyeido
date: 2026-03-20 10:51:00
time: 10:51 AM
---

View File

@@ -0,0 +1,7 @@
---
title: White Sage Mage
manufacturer: The World Makes Scents
date: 2026-03-30 13:24:00
time: 1:24 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Autumn Leaves
manufacturer: The Mothers Fragrances
date: 2026-03-30 15:27:00
time: 3:27 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Morning Star Patchouli
manufacturer: Nippon Kodo
date: 2026-04-02 9:07:00
time: 9:07 AM
---

View File

@@ -0,0 +1,7 @@
---
title: Moss Garden (Nokiba)
manufacturer: Shoyeido
date: 2026-04-06 15:04:00
time: 3:04 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Jinko Daikoboku
manufacturer: Seikado
date: 2026-04-07 8:46:00
time: 8:46 AM
---

View File

@@ -0,0 +1,7 @@
---
title: Morning Star Pine
manufacturer: Nippon Kodo
date: 2026-04-07 10:46:00
time: 10:46 AM
---

View File

@@ -0,0 +1,7 @@
---
title: "Frankincense & Myrrh with Sacred Sage"
manufacturer: Fred Soll
date: 2026-04-08 15:57:00
time: 3:57 PM
---
A very powerfully fragranced stick.

View File

@@ -0,0 +1,7 @@
---
title: Hagi
manufacturer: Tennendo
date: 2026-04-13 13:02:00
time: 1:02 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Koin
manufacturer: Gyokushodo
date: 2026-04-14 19:33:00
time: 7:33 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Friend of Pine
manufacturer: Shoyeido
date: 2026-04-15 11:31:00
time: 11:31 AM
---

View File

@@ -0,0 +1,7 @@
---
title: Nag Champa Cotton Candy
manufacturer: Satya
date: 2026-04-18 19:15:00
time: 7:15 PM
---
Smells like burning sugar.

View File

@@ -0,0 +1,7 @@
---
title: Suzaku
manufacturer: Gyokushodo
date: 2026-04-27 10:18:00
time: 10:18 AM
---

View File

@@ -0,0 +1,7 @@
---
title: "Kin-Kaku (Golden Pavilion)"
manufacturer: Shoyeido
date: 2026-04-29 09:37:00
time: 9:37 AM
---
It took me a while to warm up to these sticks. No idea why—they're lovely.

View File

@@ -0,0 +1,7 @@
---
title: Butterfly Spring Incense
manufacturer: Lijiali
date: 2026-04-29 11:11:00
time: 11:11 AM
---

View File

@@ -0,0 +1,7 @@
---
title: "Moss Garden (Nokiba)"
manufacturer: Shoyeido
date: 2026-05-01 13:18:00
time: 1:18 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Boswellia Carterii
manufacturer: Scents of Earth
date: 2026-05-01 19:57:00
time: 7:57 PM
---
Lovely notes of cold cantaloupe and honey.

View File

@@ -0,0 +1,7 @@
---
title: Sarasoju
manufacturer: Shunkohdo
date: 2026-05-04 10:00:00
time: 10:00 AM
---
Killer daily sandalwood stick.

View File

@@ -0,0 +1,7 @@
---
title: Suzaku
manufacturer: Gyokushodo
date: 2026-05-05 9:11:00
time: 9:11 AM
---

View File

@@ -0,0 +1,7 @@
---
title: Menthamericana
manufacturer: Xinú
date: 2026-05-05 11:44:00
time: 11:44 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Frankincense Oman
manufacturer: Tennendo
date: 2026-05-09 14:52:00
time: 2:52 PM
---
Only three sticks left! :[

View File

@@ -0,0 +1,7 @@
---
title: "Excellentia (Shira-giku)"
manufacturer: Shoyeido
date: 2026-05-11 9:51:00
time: 9:51 AM
---
Some days you just find yourself in the mood for nine hours of continuous fragrance.

View File

@@ -0,0 +1,7 @@
---
title: Hippie Hug
manufacturer: The World Makes Scents
date: 2026-05-18 12:40:00
time: 12:40 PM
---

View File

@@ -0,0 +1,7 @@
---
title: Morning Star Lavender
manufacturer: Nippon Kodo
date: 2026-05-21 11:47:47
time: 11:47 AM
---
Meh.

View File

@@ -0,0 +1,7 @@
---
title: Suifu
manufacturer: Yamadamatsu
date: 2026-05-23 15:02:33
time: 3:02 PM
---

View File

@@ -9,10 +9,10 @@ postlistHeaderText: "What I've been burning:"
{% set burning = collections.nowBurning | last %} {% set burning = collections.nowBurning | last %}
<h1>Now Burning:</h1> <h1>Now Burning:</h1>
<article class="post microblog-post"> <article class="post microblog-post" data-pagefind-body>
<img class="microblog-icon" src="/img/censer.svg"> <svg class="microblog-icon" xmlns="http://www.w3.org/2000/svg" width="397.265" height="1334.648" viewBox="0 0 105.11 353.126"><path d="M107.422 160.854s-16.31-.307-10.002-23.543c6.309-23.235 9.079-29.543 2.616-38.16s-8.31-16.927-2.924-20.312 19.542-1.23 22.927 8.002c3.386 9.232-8.001-9.233-18.464-4.001-10.464 5.232 19.388 15.541 16.002 28.005-3.385 12.464-8.85 11.387-7.312 20.158 1.539 8.77 11.62 13.54 7.466 21.542s-10.31 8.31-10.31 8.31" style="fill-opacity:.1;stroke-width:.176994;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke markers fill" transform="translate(-105.56 -112.273)scale(1.47357)"/><path d="M76.434 211.488c-2.753 4.398-4.194 9.316-4.194 14.313 0 11.22 7.23 22.978 18.772 28.19v3.851c0 1.274 1.026 2.3 2.3 2.3h1.298c1.274 0 2.3-1.026 2.3-2.3v-1.752q.972.26 1.96.47-.05.235-.05.483v.805c0 1.275 1.026 2.3 2.3 2.3h10.121c1.275 0 2.3-1.025 2.3-2.3v-.805l-.001-.08q.96-.15 1.911-.345v1.224c0 1.274 1.027 2.3 2.301 2.3h1.297c1.274 0 2.3-1.026 2.3-2.3v-2.925c12.764-4.806 21.011-17.124 21.01-29.116 0-4.997-1.44-9.915-4.193-14.313H105zM105 148.46v61.93h4.6v-61.93z" style="stroke-width:.260177;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke markers fill" transform="translate(-105.56 -112.273)scale(1.47357)"/><path d="M107.3 142.38a2.295 2.295 0 0 0-2.3 2.3v2.682h4.6v-2.681c0-1.275-1.026-2.3-2.3-2.3" style="fill-opacity:1;stroke-width:.264583;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke markers fill" transform="translate(-105.56 -112.273)scale(1.47357)"/></svg>
<div class="microblog-status"> <div class="microblog-status">
<h2 class="">{{ burning.data.title }}{% if burning.data.manufacturer %}, {{ burning.data.manufacturer }}{% endif %}, {{ burning.date | niceDate }}, {{ burning.data.time }}</h2> <h2 class="">{{ burning.data.title }}{% if burning.data.manufacturer %}, {{ burning.data.manufacturer }}{% endif %}, <br>{{ burning.date | niceDate }}, {{ burning.data.time }}</h2>
{% if burning.content %} {% if burning.content %}
<div class="microblog-comment"> <div class="microblog-comment">
{{ burning.content | safe }} {{ burning.content | safe }}
@@ -21,5 +21,5 @@ postlistHeaderText: "What I've been burning:"
</div> </div>
</article> </article>
<a href="/once-burned/"> <a href="/once-burned/">
<button type="button">Previous Entries »</button> <button type="button">Previous Entries</button>
</a> </a>

Some files were not shown because too many files have changed in this diff Show More