Compare commits

...

10 Commits

Author SHA1 Message Date
153b178c40 UI updates 2025-01-23 14:24:51 -06:00
ef37d7622d Update changelog 2025-01-23 14:23:00 -06:00
7c06d746d4 Styling tweaks 2025-01-23 14:22:51 -06:00
a2dd293bf0 Update wishlist 2025-01-23 14:22:35 -06:00
aaae71adf9 Deprecate comment embedding in favor of button 2025-01-23 14:21:53 -06:00
f758f1c973 Change postlist header 2025-01-23 14:20:46 -06:00
4a4b2464da Re-size post image 2025-01-23 14:20:24 -06:00
7063473cd7 Add entry to blogroll 2025-01-23 14:20:08 -06:00
9defa3baf2 Add now entry 2025-01-23 14:19:42 -06:00
b83e4132ee Add post 2025-01-23 14:19:33 -06:00
33 changed files with 297 additions and 203 deletions

View File

@ -303,6 +303,12 @@ export default {
{
name: "News: U.S.A.",
blogs: [
{
title: "Popular Information",
feedUrl: "https://popular.info/feed",
url: "https://popular.info/",
description: "News for people who give a damn.",
},
{
title: "Reveal from the Center for Investigative Reporting",
feedUrl: "https://revealnews.org/feed",

View File

@ -19,7 +19,7 @@ export default {
defaultPostImageAlt: "The logo for this blog: a capital letter N.",
mastodonHost: "lounge.town",
mastodonUser: "nathanu",
postlistHeaderText: "Writings from my blog:",
postlistHeaderText: "Latest blog posts:",
socialLinks: [
{
title: "My Blog",

View File

@ -2,7 +2,7 @@
layout: layouts/base.njk
showPostListHeader: yep
---
<h1>Hi there, friend.</h1>
<p class="nodropcap page-block">My name is Nathan Upchurch. Welcome to my personal website and blog, where I write about all sorts of <a href="/tags">things</a> that I find interesting. On this website, you can learn more <a href="about">about me</a>, see <a href="now">what Ive been up to lately</a>, <a href="blog">read my blog</a>, look at some <a href="galleries">pictures</a>, or explore the <a href="sitemap">sitemap</a> to see what else you can do here.</p>
<h1>I'm 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. On this website, you can learn more <a href="about">about me</a>, see <a href="now">what Ive been up to lately</a>, <a href="blog">read my blog</a>, look at some <a href="galleries">pictures</a>, or explore the <a href="sitemap">sitemap</a> to see what else you can do here.</p>
{{ content | safe }}

View File

@ -4,7 +4,7 @@ layout: layouts/base.njk
{# Only include the syntax highlighter CSS on blog posts #}
{%- css %}{% include "public/css/code.css" %}{% endcss %}
<article class="post">
<h1>{{ title }}</h1>
<h1>{{ title | safe }}</h1>
{% if not hideMetadata %}
<div class="post-metadata">
{% if author %}
@ -13,7 +13,7 @@ layout: layouts/base.njk
{% endif %}
<div class="post-metadata-copy">
<p>{% if author.url %}<a href="{{ author.url }}">{% endif %}
{% if author.name %}{{ author.name }}{% endif %}{% if author.url %}</a>,&nbsp;{% endif %}<time datetime="{{ page.date | htmlDateString }}">{{ page.date | readableDate }}</time></p>
{% if author.name %}By {{ author.name }}{% endif %}{% if author.url %}</a>&nbsp;•&nbsp;{% endif %}<time datetime="{{ page.date | htmlDateString }}">{{ page.date | niceDate }}</time></p>
{% else %}
{% if metadata.author.profilePic %}
@ -21,7 +21,7 @@ layout: layouts/base.njk
{% endif %}
<div class="post-metadata-copy">
<p>{% if metadata.author.url %}<a href="{{ metadata.author.url }}">{% endif %}
{% if metadata.author.name %}{{ metadata.author.name }}{% endif %}{% if metadata.author.url %}</a>,&nbsp;{% endif %}<time datetime="{{ page.date | htmlDateString }}">{{ page.date | readableDate }}</time></p>
{% 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></p>
{% endif %}
@ -44,4 +44,3 @@ layout: layouts/base.njk
{{ content | safe }}
</article>
{% include "mastodonComments.njk" %}
{% include "nextLast.njk" %}

View File

@ -1,81 +1,12 @@
{% if mastodon_id %}
<section class="" id="comment-section">
<h2>Comments</h2>
<div class="comment-ingress"></div>
<div id="comments" data-id="{{ mastodon_id }}">
<p>Loading comments...</p>
</div>
<div class="continue-discussion">
<a class="link-button" href="https://{{ metadata.mastodonHost }}/@{{ metadata.mastodonUser }}/{{ mastodon_id }}">
<button type="button">
Reply on Mastodon to comment &#187;
<img src="/img/mastodon.svg">
Discuss on Mastodon &#187;
</button>
</a>
</div>
</section>
<template id="comment-template">
<wc-card>
<wc-comment
author_name=""
author_url=""
avatar_url=""
comment_content=""
publish_date=""
sharp_corner="">
</wc-comment>
</wc-card>
</template>
<script type="module">
import {dateSuffixAdder, monthMap, timeFormatter} from "../../js/modules/mastodonDateTools.js";
const renderComment = (comment, target, parentIdm) => {
const node = document
.querySelector("template#comment-template")
.content.cloneNode(true);
const dateObj = new Date(comment.created_at);
const dateTime = `${dateObj.getDate()}${dateSuffixAdder(dateObj.getDate())} of ${monthMap[dateObj.getMonth()]}, ${dateObj.getFullYear()}, at ${timeFormatter(dateObj.getHours(), dateObj.getMinutes())}`;
node.querySelector("wc-comment").setAttribute("author_name", comment.account.display_name);
node.querySelector("wc-comment").setAttribute("author_url", comment.url.replace(/\/[0-9]+/, ""));
node.querySelector("wc-comment").setAttribute("avatar_url", comment.account.avatar_static);
node.querySelector("wc-comment").setAttribute("comment_content", comment.content);
node.querySelector("wc-comment").setAttribute("publish_date", dateTime);
target.appendChild(node);
}
async function renderComments() {
const commentsNode = document.querySelector("#comments");
const mastodonPostId = commentsNode.dataset?.id;
if (!mastodonPostId) {
return;
}
commentsNode.innerHTML = "";
const originalPost = await fetch(
`https://{{ metadata.mastodonHost }}/api/v1/statuses/${mastodonPostId}`
);
const originalData = await originalPost.json();
renderComment(originalData, commentsNode, null);
const response = await fetch(
`https://{{ metadata.mastodonHost }}/api/v1/statuses/${mastodonPostId}/context`
);
const data = await response.json();
const comments = data.descendants;
comments.forEach((comment) => {
renderComment(comment, commentsNode, mastodonPostId);
});
}
renderComments();
</script>
{% endif %}

View File

@ -1,23 +1,44 @@
<section class="postlist">
{% if showPostListHeader %}<h2>{{ metadata.postlistHeaderText }}</h2>{% endif %}
<div class="postlist-item-container">
{% for post in postslist | reverse %}
<article class="postlist-item{% if post.url == url %} postlist-item-active{% endif %}">
<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>
<div class="post-copy">
{% if showPostListHeader %}<h2>{{ metadata.postlistHeaderText }}</h2>{% endif %}
<div class="postlist-item-container">
{% for post in postslist | reverse %}
<article class="postlist-item{% if post.url == url %} postlist-item-active{% endif %}">
<a href="{{ post.url }}" class="postlist-link">
<h3>
{% if post.data.title %}{{ post.data.title }}{% else %}<code>{{ post.url }}</code>{% endif %}
</h3>
<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>
<time class="postlist-date" datetime="{{ post.date | htmlDateString }}">{{ post.date | readableDate("LLLL yyyy") }}</time>
{% if post.data.synopsis %}<p>{{ post.data.synopsis | truncate(105) | safe }}</p>{% else %}{{ post.data.description | truncate(105) | safe }}{% endif %}
</div>
</article>
{% endfor %}
</div>
<div class="post-copy">
<a href="{{ post.url }}" class="postlist-link">
<h3>
{% if post.data.title %}{{ post.data.title | safe }}{% else %}<code>{{ post.url }}</code>{% endif %}
</h3>
</a>
<div class="post-metadata">
<div class="post-metadata-copy">
<p>
{% if post.data.author %}
{% if post.data.author.url %}<a href="{{ post.data.author.url }}">{% endif %}{% if post.data.author.name %}By {{ post.data.author.name }}{% endif %}{% if post.data.author.url %}</a>&nbsp;•&nbsp;{% endif %}{% else %}<a href="{{ metadata.author.url }}">By {{ metadata.author.name }}</a>&nbsp;•&nbsp;{% endif %}<time datetime="{{ post.date | htmlDateString }}">{{ post.date | niceDate }}</time>
</p>
<ul>
{%- for tag in post.data.tags | filterTagList %}
{%- set tagUrl %}/tags/{{ tag | slugify }}/{% endset %}
<li>
<a
href="{{ tagUrl }}"
class="post-tag">
{{ tag }}&nbsp;
</a>
</li>
{%- endfor %}
</ul>
</div>
</div>
</div>
</article>
<hr>
{% endfor %}
</div>
</section>

View File

@ -5,7 +5,7 @@ eleventyNavigation:
order: 2
---
<article>
<h1>About me and my 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, daily GNU/Linux user and unabashed <a href="https://kde.org/">KDE</a> stan, designer, programmer, music producer, print lover, and human with too many interests and too little time. This is my little corner of the internet where I talk about whatever I like without worrying about maintaining a personal brand, or constraining subject matter 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. 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/">

View File

@ -6,10 +6,10 @@ eleventyNavigation:
key: Blog
order: 3
---
<h1>Nathans blog.</h1>
<h1>My personal blog.</h1>
<p class="page-block nodropcap">
Thank you for visiting my blog; I write about lots of things here, 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>. Explore all posts below or <a href="/tags/">choose a topic</a>. Want to know what I've been reading? <a href="../blogroll/">Exlore the blogroll</a>.<br />
I write about whatever I like here, 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/">
<button type="button">Topics »</button>

View File

@ -0,0 +1,88 @@
---
title: "The Skinny on Incense Stick Extruders"
description: "The good, the bad, and the ugly of manual incense stick extruders."
date: 2025-01-23
tags:
- Incense
- Incense Making
synopsis: "The good, the bad, and the ugly of manual incense stick extruders."
imageURL: /img/extruders/extr3_3x_tip_compressed.webp
imageAlt: "A close shot of an incense extruder tip with three extrusion holes."
mastodon_id: "113879431946665708"
author:
url: "/me/"
name: "Nathan Upchurch"
profilePic: "/img/CN20191025_301_Srt_SQUARE_crop.jpg"
---
Given that hobbyist incense making hasn't exactly been all the rage since the tang dynasty, finding good incense-making equipment for small-scale home production can be a bit of a tribulation. If you make Chinese or Japanese style coreless incense, one of the first hurdles on the way to kitting out your very own mini incense workshop is choosing a manual extruder. Now that I finally feel confident that I've overcome this particular hurdle, here's what I've learned:
## Where to Find a Suitable Extruder
When searching for manual extruders, the first thing you'll likely come across is something like a [Makin's](https://www.makins-usa.com/products.jsp?prod_catg_id=7) clay extruder. This style of extruder often comes with a series of small discs designed to extrude clay noodles of different diameters. These are best avoided; other incense makers have found that extruding incense through these flat discs tends to create noodles with [a coarse texture](https://youtu.be/snvDZbxHnU8?si=ap7oiw0iC_HQJhCy&t=245) that must be rolled smooth after extrusion. Omitting this style of extruder from your search *drastically* narrows your options, but searching "incense extruder" on the website of any major online retailer that dropships or stocks a large number of products from China is likely to net you results featuring extrusion tips better suited to incense making. If you are willing to wait a bit for delivery, however, rather than paying Walmart, Amazon, or Ebay a convenience tax, you will have no trouble finding manual extruders on AliExpress directly for much less of your hard-earned coin. Carl "The Incense Dragon" Neal also sells a [Makin's style extruder](https://www.theincensedragon.com/tools/p/incense-extruder-20) that includes a series of 3D-printed extrusion tips allowing smooth incense extrusion.
## Extruders I've Tried
### The Syringe-Style Extruder
The internet is riddled with [syringe-style incense extruders](https://www.aliexpress.us/item/3256804771983263.html). Despite [Carl's warning regarding plastic extruders](https://youtu.be/snvDZbxHnU8?si=p59DxZMXcw64BHfi&t=278), I had to give one a go just to see for myself how they performed.
[![A syringe-style clear plastic incense extruder with a metal tip.](/img/extruders/extr1_compressed.webp "Just say no.")](/img/extruders/extr1_compressed.webp)
I cannot recommend this style of extruder. When making incense dough, it's important to use as little water as possible to avoid excessive warping during the drying stage. When attempting to extrude dough of the usual level of hydration through a 2mm tip, I was physically unable to coax any dough whatsoever beyond the extrusion tip, and I am not a weak man. This extruder was a complete bust.
[![A small metal extrusion tip.](/img/extruders/extr1_tip_compressed.webp "I'm sure this would be great if you could get anything through it.")](/img/extruders/extr1_tip_compressed.webp)
There are a range of metal extrusion tips readily available for these extruders, so someone must be using them for *something,* but I found them completely unsuited for my purposes.
### The Aluminum Option
Also relatively easy to find, [these aluminum extruders](https://www.aliexpress.us/item/3256807354775579.html) are well-made and effective:
[![An aluminum incense extruder, similar to the Makin's clay extruder, but with a longer tip for incense extrusion.](/img/extruders/extr2_compressed.webp "Truly a good, affordable option.")](/img/extruders/extr2_compressed.webp)
So long as you keep the o-ring on the piston lubricated and your dough doesn't have any large chunks, the extrusion tip produces a nice, smooth noodle of incense dough, and the turning action greatly reduces the hand-strength required to operate the device.
[![The tip for the aluminum incense extruder.](/img/extruders/extr2_tip_compressed.webp "Various tips are also available.")](/img/extruders/extr2_tip_compressed.webp)
There are a couple of small issues, namely that the caps on the turning rod can come unscrewed mid-batch if they aren't firmly screwed on, and the soft metal is prone to damage if you aren't careful. Despite these nitpicks, however, I have no hesitation in recommending this style of extruder to any incense maker focusing on thin coreless sticks.
### My First Stainless Steel Extruder
As I've been working on scaling up my production to a level that would allow me to sell a few orders of incense here and there, my interest was sparked in [this stainless steel extruder on AliExpress](https://www.aliexpress.us/item/3256806453629799.html):
[![A heavy-duty looking stainless steel incense extruder, with a black grip around the center tube.](/img/extruders/extr3_compressed.webp "Looks good, doesn't it? Well it isn't.")](/img/extruders/extr3_compressed.webp)
Specifically, I hoped that the optional extrusion tip with three outlets and the vise accessory would allow me to speed up the extrusion process. I also liked the idea of a heavy-duty item that would last for many years. I bought the "high order style," which comes with four extrusion tips, a grip, some o-rings and small cleaning tools, and the extruder itself. I also ordered the three-outlet extrusion tip, and the "sucker holder," AKA a vacuum-base vise.
[![The three-outlet tip.](/img/extruders/extr3_3x_tip_compressed.webp "Not as useful as you might think.")](/img/extruders/extr3_3x_tip_compressed.webp)
To start, the three-hole extrusion tip worked, but as anyone who works with [larger manual extruders](https://www.aliexpress.us/item/3256807859213019.html?utparam-url=scene%3Asearch%7Cquery_from%3A) knows, the flow rate from each hole isn't necessarily even. This is less of a problem when you're extruding, say, six to twelve sticks at once at a proper station with a waste bucket and a stack of boards to catch the extruded incense, but when you're hand-cranking three sticks at a time and one is firing out like billy-oh, another is extruding at the usual rate, and the last seems frightened of daylight, you realize that you would have been better off just using a normal single-outlet tip.
[![A single-outlet tip.](/img/extruders/extr3_tip_compressed.webp "The large tips that fit this extruder also retain rather a lot of dough that doesn't get extruded.")](/img/extruders/extr3_tip_compressed.webp)
The vise *was* useful, however; it's much more efficient to be able to keep the extruder in one place and have a free hand to catch the sticks on a board. The problem I faced with it was that in order to get the extruder to fit within the vise, I had to fasten an included aluminum ring around the main body of the extruder using two grub-screws. These grub screws cut into the grip on the tube, which eventually tore from the force applied during extrusion.
[![The vise alongside the aluminum ring that allows it to hold an extruder.](/img/extruders/vise_compressed.webp "Genuinely pretty useful, just not with the grip on the extruder it is sold alongside.")](/img/extruders/vise_compressed.webp)
The extruder itself appeared to be assembled from mostly off-the-shelf parts, and not especially good ones. The rings that held the turning-rod in place rusted immediately after I got them a little wet, the threads were crunchy and coarse, and the interior of the dough-tube was very dirty. Perhaps most strangely of all, the piston, or plunger, that actually pushed the dough down the tube was not attached to the threaded rod at all, unlike the aluminum extruder.
[![A little plunger.](/img/extruders/extr3_plunger_compressed.webp "Note the scoring on top; it didn't come like that.")](/img/extruders/extr3_plunger_compressed.webp)
The plunger is made of mostly brass parts that screw together and a rubber o-ring. It's very thick, reducing room for dough, and the soft brass is rapidly worn away by the stainless steel threaded rod as it spins loosely down the dough tube during extrusion, leaving sparkly grit to get mixed into your next batch of incense. It continued to wear even after I had filed and sanded down the raised parts on the end of the threaded rod.
As a result of all this, the plunger becomes more worn with every use, the dough tube becomes covered in grime, and the extrusion action is crunchy and rough. I was *very* disappointed in this extruder, and I cannot recommend it. The silver lining here is the vise, which will work with any of the metal extruders listed; in my opinion it's a worthwhile purchase.
### My Current Extruder
[This extruder](https://www.amazon.com/dp/B0DP3H8CCL) was an enigma. I hadn't seen it anywhere before it surfaced several pages deep into an Amazon search.
[![A stainless steel incense extruder that looks much better made than the last one.](/img/extruders/extr4_compressed.webp "Could this be the one?")](/img/extruders/extr4_compressed.webp)
I tried to find a Chinese source through a reverse image search. Tineye, Google, Bing, and Yandex turned up nothing. Only when I began to search the sales copy in the Amazon listing did I find the item for sale elsewhere ~~but I still never managed to find a single instance of this product being sold on AliExpress (if you manage to find one, [do let me know](/me/))~~.[^1]
It *looked* great: stainless steel; a knurled dough tube; various accessories included. The Amazon listing didn't show it, but when I looked at other listings I saw that the piston appeared to be attached to the threaded rod. Jackpot!
When it arrived, I noticed a few things immediately. The knurling was shallow and not especially neat, as though it had been etched twice over and the etchings didn't quite align. The tips shown weren't included; instead of five tapered tips in different sizes, I received three flat 2mm tips. That might be a deal-breaker for some, as I don't even know where you'd begin to find additional tips for this thing, but as I extrude 2mm sticks almost exclusively, I don't mind. I'm also not bothered by the ugly knurling either, because the performance of this extruder is great.
To begin with, the threaded rod isn't some industrial looking piece of hardware like the last stainless extruder; it looks more like a high-quality leadscrew you'd expect to see on a laser cutter or some other piece of CNC equipment where precise, measured movement is critical. This keeps the extrusion action exceptionally smooth. The threads on all of the other caps are also nicely machined, and the small extrusion tips have minimal space to accumulate wasted dough after a batch is extruded.
[![The tip for my current extruder.](/img/extruders/extr4_tip_compressed.webp "Perfect!")](/img/extruders/extr4_tip_compressed.webp)
Fitted into my vise, this extruder is a dream. The smoothness and consistency of the extrusion makes one-handed operation a breeze. I did add some o-rings to the turning rod to reduce noise, and while I do find myself wishing it didn't fit quite so loosely inside the cap on the leadscrew, these really are nitpicks of the best extruder I've used to date.
[^1]: I have since found what appears to be the same item on [AliExpress](https://www.aliexpress.us/item/3256807712368107.html?utparam-url=scene%3Asearch%7Cquery_from%3A), [Taobao](https://vn.world.taobao.com/item/858074002289.htm), [Wepost](https://www.wepost.com.my/shops/taobao-items/554179126072.html?sku_properties=1627207:2846750301) (which has a [very dramatic video](https://cloud.video.taobao.com/play/u/719156502/p/2/e/6/t/1/440842077674.mp4) showing the extruder in operation), and [1688.com](https://detail.1688.com/offer/750437159209.html). Accessories also appear to be available through these sources.

View File

@ -4,6 +4,13 @@ title: Nathan Upchurch | Changelog
structuredData: none
---
# Changelog
* 2025-1-23 - Simplify, simplify, simplify
* Styling updates to text, figures, and post lists
* Removed Mastodon comment embedding in favor of a simple button.
* Removed "Read Next / Read Previous" cards beneath articles.
* Prettier date formatting throughout.
* 2025-1-13
* Added [Popular Information](https://popular.info/) to the [blogroll](/blogroll).
* 2024-12-16
* Update PeerTube instance on [/me](/me).
* 2024-12-15

View File

@ -33,7 +33,7 @@ permalink: "/feeds/{{ tag | slugify }}.xml"
{% if post.data.imageURL %}{% set imageURL %}{{ post.data.imageURL | htmlBaseUrl(metadata.url) }}{% endset %}{% endif %}
{% set defaultImageURL %}{{ metadata.defaultPostImageURL | htmlBaseUrl(metadata.url) }}{% endset %}
<entry>
<title>{{ post.data.title }}</title>
<title>{{ post.data.title | safe }}</title>
<description>{{ post.data.description | truncate(150) }}</description>
<link href="{{ absolutePostUrl }}"/>
<updated>{{ post.date | dateToRfc3339 }}</updated>
@ -44,6 +44,7 @@ permalink: "/feeds/{{ tag | slugify }}.xml"
<link href="{{ absolutePostUrl }}"/>
</image>
<content type="html">{{ post.templateContent | transformWithHtmlBase(absolutePostUrl, post.url) }}</content>
<hr>
</entry>
{%- endfor %}
</feed>

View File

@ -4,9 +4,9 @@ eleventyNavigation:
key: Pics
order: 4
---
<h1>Image Galleries</h1>
<h1>My image galleries.</h1>
<p class="page-block nodropcap">
Some pictures I thought would be worth posting.
Photography trips, memes, and other pictures I thought would be worth sharing.
</p>
<section class="postlist">
<div class="postlist-item-container">
@ -23,10 +23,15 @@ Some pictures I thought would be worth posting.
{{ gallery.title }}
</h3>
</a>
<time class="postlist-date" datetime="{{ gallery.date | htmlDateString}}">{{ gallery.date | readableDate("LLLL yyyy") }}</time>
<p>{{ gallery.synopsis | truncate(105) | safe }}</p>
<div class="post-metadata">
<div class="post-metadata-copy">
<p>Posted on the&nbsp;<time class="postlist-date" datetime="{{ gallery.date | htmlDateString}}">{{ gallery.date | niceDate("LLLL yyyy") }}</time></p>
</div>
</div>
</div>
</article>
<hr>
{% endfor %}
</div>
</section>

View File

@ -3,7 +3,7 @@ layout: layouts/home.njk
eleventyNavigation:
key: Home
order: 1
numberOfLatestPostsToShow: 5
numberOfLatestPostsToShow: 3
numberOfNowPostsToShow: 1
---
<div class="now">
@ -14,11 +14,15 @@ numberOfNowPostsToShow: 1
{% set postslistCounter = postsCount %}
{% set showPostListHeader = false %}
{% include "postslist.njk" %}
{% set morePosts = postsCount - numberOfNowPostsToShow %}
{% if morePosts > 0 %}
<a href="/now/">
<button type="button">
See more on the “now” page »
See {{ morePosts }} more »
</button>
</a>
{% endif %}
</div>
{% set postsCount = collections.posts | length %}
@ -32,7 +36,10 @@ numberOfNowPostsToShow: 1
{% if morePosts > 0 %}
<a href="/blog/">
<button type="button">
See {{ morePosts }} more post{% if morePosts != 1 %}s{% endif %} in the blog »
See {{ morePosts }} more »
</button>
</a>
</a>&nbsp;
{% endif %}
<a href="/tags/">
<button type="button">Topics »</button>
</a>

View File

@ -4,12 +4,12 @@ title: Nathan Upchurch | Now
structuredData: none
---
<article class="post">
<h1>Now: Whats Been Going on Lately?</h1>
<h1>Now: Life updates.</h1>
{% set now = collections.now | last %}
<h2>{{ now.data.title }}</h2>
{{ now.content | safe }}
</article>
<p class="metadata">Updated: {{ now.date | readableDate }} |&nbsp;<a href="https://nownownow.com/about">What is a now page?</a></p>
<p class="metadata">Updated on the {{ now.date | niceDate }} by {{ metadata.author.name }} |&nbsp;<a href="https://nownownow.com/about">What is a now page?</a></p>
{% set postsCount = collections.now | removeMostRecent | length %}
{% if postsCount > 1 %}

View File

@ -0,0 +1,23 @@
---
title: Welp, it's a New Year.
description: …and what a year it's been already.
synopsis: …and what a year it's been already.
date: 2025-01-23
imageURL: /img/IMG_20250122_172636_762_copy.webp
imageAlt: A closeup of a Braun wristwatch.
---
[Trump has been inaugurated](https://thehill.com/homenews/administration/5097933-trump-ymca-dance-inaugural-ball/); Elon Musk is [performing Nazi salutes](https://www.politico.eu/article/elon-musk-salute-sparks-fury-from-europe-left-wing/) in public, the U.S. is [withdrawing from the Paris Agreement](https://www.npr.org/2025/01/21/nx-s1-5266207/trump-paris-agreement-biden-climate-change), the White House Spanish-language pages have been [shut down](https://www.pbs.org/newshour/politics/trump-adminstration-shuts-down-white-house-spanish-language-page-and-social-media), [whitehouse.gov](https://www.whitehouse.gov/) now features some sort of [onanistic hyper-nationalist movie trailer](https://www.wired.com/story/white-house-website-marvel-movie-trailer-helicopters-bald-eagle/), the federal government is [officially hostile](https://19thnews.org/2025/01/trump-transgender-executive-order/) to [transgender people](https://19thnews.org/2025/01/trump-executive-order-transgender-military-ban/), the Trump administration has [ended birthright citizenship](https://19thnews.org/2025/01/birthright-citizenship-lawsuit-pregnant-women/), immigrants are [hiding in their homes](https://www.chicagotribune.com/2025/01/21/immigrants-skip-work-amid-ice-fears/) for fear of arrest and deportation, an official government website has a god-damn [Shiba Inu meme](https://abcnews.go.com/Politics/wireStory/trump-made-doge-part-government-117981045) on it (along with an ASCII version in the page source), more than half of U.S. citizens [read below a sixth-grade level](https://www.snopes.com/news/2022/08/02/us-literacy-rate/) (that's the level expected of a twelve-year-old), capitalism is still steamrolling ahead just about everywhere, people are still eating cute, fluffy animals even though beans exist, you're now officially, explicitly, [allowed to call LGBTQ+ people mentally ill](https://www.axios.com/2025/01/09/meta-moderation-transgender-women-hate) on Facebook, Threads, and Instagram, and the planet is burning.
Anyway, the *now* section of my website is supposed to be a bit less existential, so here's what I've been up to:
I spent much of the end of the year working four-day workweeks, which, my friends, is the way to go. I miss those short weeks already. After that, I had a Christmas celebration with Sol's folks, which, despite a minor medical emergency was a nice time. I am happy to say that the person affected is recovering well. I gave some hand-made incense for presents, and I got some very useful things from my [wishlist](/wishlist/), including a Braun wall-clock so that I can tell the time when I'm doing dishes or otherwise can't access, or don't want to be distracted by, my phone.
One thing I'm trying to focus on in this new year is being less salty. I'm trying to accept people as they come, and regain the calm that I used to be able to retain in the face of great stupidity. Goodness knows there are people in this world who offer me this grace, so I intend to get some practice in offering it to others.
I've started [a forum](https://incensemakers.org/) for the fine folks of the incense-makers Instagram group. I'm very much hoping it takes off, because not only will it be a better, safer, and more useful way to catalog our shared knowledge, but it might mean that I can once again leave Instagram as the group is literally the only reason I'm on the platform. I'm also hoping that I don't wind up having to do much troubleshooting; we will see.
I am also working towards the [Google data analytics professional certificate](https://www.coursera.org/professional-certificates/google-data-analytics) because it seems like it ought to be fun, especially learning SQL (which I refuse to pronounce *sequel*) and R. If it turns out to be useful career-wise, great, but that's not why I'm doing it.
[^1]: And no, I don't mean give a portion to charity. The fact that you are rich should not mean that you get an outsized say in what issues get addressed. Get over yourself.

View File

@ -4,10 +4,10 @@ layout: layouts/base.njk
title: Nathan Upchurch | Tags
structuredData: none
---
<h1>Here are some things I like to talk about.</h1>
<h1>Some things I like to&nbsp;talk about:</h1>
<p class="page-block nodropcap">
Click on a tag to see all posts on the topic.
Click on a tag to see all posts on the topic; you can also subscribe to an RSS feed of any individual topic on the topic page.
</p>
<ul class="taglist">

View File

@ -16,7 +16,6 @@ If, however, *not* getting me a gift seems unconscionable, as best as I can dete
If, like my mother, the non-consumable items below seem too boring to you to satisfy the gift-giving itch, I'd always be delighted to receive anything from the [tea](#Tea), [edible](#Edible), or [incense](#Incense) sections.
## ADHD proofing / accessibility
* [A Braun wall clock](https://www.amazon.com/Braun-Analogue-Sweeping-Movement-Diameter/dp/B0CJFWHJQX?th=1) - A couple of wall clocks in the house would be great for keeping an eye on the time without needing to extract my phone from my pocket, risking distraction, especially when my hands are buried in a sink full of dishes or covered in incense dough.
* [A door organizer](https://www.amazon.com/Delamu-Organizers-Organization-Essentials-D5xW18xH50/dp/B0C4LPSQP3?th=1)
* [A lid organizer for food containers](https://www.amazon.com/dp/B07FNRXFTD/?psc=1)
* [Drawer organizing containers](https://www.amazon.com/dp/B07F7K5DP1/?th=1)
@ -31,7 +30,6 @@ If, like my mother, the non-consumable items below seem too boring to you to sat
* [Transactual](https://transactual.org.uk/) - A trans-led UK based organization working towards a world where trans people can live safely, in dignity and with access to the healthcare they need.
## Edible
* [Smoked finishing salt](https://www.amazon.com/Maldon-Smoked-Salt-Flakes-Ounce/dp/B00CMX5BVQ) - a beautiful way to finish a dish, and I'm fresh out.
* Vegan haggis - I just miss haggis, and I remember vegan / vegetarian haggis being quite good. I did make a batch of my own once with TVP and it was nice, but it took ages to make.
* Vegan mooncakes from [Little Moon Bakehouse](https://littlemoonbakehouse.com/)
@ -49,7 +47,6 @@ If, like my mother, the non-consumable items below seem too boring to you to sat
## Incense making
* [Oak moss](https://www.amazon.com/Oak-Moss-Herb-Natural-Prunastri/dp/B0B4KL6WSJ)
* [One of those terrifying Chinese grinders](https://www.amazon.com/dp/B09ZPGRSZ9/?th=1) - for grinding woods to powder.
* [Powdered ruffle lichen / dagad phool](https://www.amazon.com/dp/B0BYB8XVPZ/?psc=1)
* [Vacuum filtration kit](https://www.amazon.com/dp/B09LB81M25/?psc=1) - For washing the gums off of resins.

View File

@ -13,7 +13,7 @@ import {
dateSuffixAdder,
monthMap,
timeFormatter,
} from "./public/js/modules/mastodonDateTools.js";
} from "./public/js/modules/dateTools.js";
const figoptions = {
figcaption: true,
@ -74,11 +74,12 @@ export default async function (eleventyConfig) {
eleventyConfig.addPlugin(pluginBundle);
// Filters
eleventyConfig.addFilter("readableDate", (dateObj, format, zone) => {
// Formatting tokens for Luxon: https://moment.github.io/luxon/#/formatting?id=table-of-tokens
return DateTime.fromJSDate(dateObj, { zone: zone || "utc" }).toFormat(
format || "dd LLLL yyyy",
);
eleventyConfig.addFilter("niceDate", (date) => {
var day = new Date(date).getUTCDate();
var monthIndex = new Date(date).getUTCMonth();
var year = new Date(date).getUTCFullYear();
return `${day}${dateSuffixAdder(day)} of ${monthMap[monthIndex]}, ${year}`;
});
eleventyConfig.addFilter("htmlDateString", (dateObj) => {

View File

@ -20,9 +20,10 @@
Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono,
Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Courier New,
Courier, monospace;
--meta-font-family: "Fraunces", serif;
--meta-font-size: var(--step--1);
--meta-font-family: "Manrope", sans-serif;
--meta-font-size: var(--step--2);
--meta-font-style: normal;
--meta-font-variation-settings: "wght" 500;
--ui-letter-spacing: calc(var(--space-3xs) * 0.5);
}
@ -51,7 +52,7 @@
--color-gray-20: #e0e0e0;
--color-gray-90: #333333;
--card-color: white;
--card-color: rgba(250, 250, 250, 1);
--contrast-color: #027860;
--background-color: #faf5f5;
--rss-orange: rgb(255, 152, 0);
@ -156,7 +157,7 @@
@media (prefers-color-scheme: dark) {
:root {
--color-gray-20: #e0e0e0;
--color-gray-20: #253848;
--color-gray-90: #dad8d8;
--card-color: #333333;
--contrast-color: #04c49e;
@ -270,6 +271,9 @@ nav {
grid-column: var(--span-grid);
padding-bottom: var(--space-l);
}
ol {
padding-left: 0;
}
section {
display: grid;
grid-column: var(--span-grid);
@ -291,10 +295,10 @@ section {
}
.page-block {
grid-column: var(--span-grid);
font-size: var(--step-1);
/* font-size: var(--step-1); */
margin: 0;
padding-bottom: var(--space-l);
line-height: calc(var(--step-1) * 0.5 + var(--step-1));
/*line-height: calc(var(--step-1) * 0.5 + var(--step-1));*/
&:has(+ a > button) {
padding-bottom: 0;
}
@ -302,12 +306,11 @@ section {
ul {
margin: 0;
grid-column: var(--span-grid);
padding-bottom: var(--space-s);
}
a {
text-decoration-color: var(--contrast-color);
text-decoration-thickness: var(--link-decoration-thickness);
/*text-decoration-thickness: var(--link-decoration-thickness);*/
transition: var(--transition-normal);
}
/* https://www.a11yproject.com/posts/how-to-hide-content/ */
@ -346,9 +349,9 @@ h1 {
"wght" 500,
"SOFT" 10,
"WONK" 1;
font-size: var(--step-5);
font-size: var(--step-4);
font-style: normal;
line-height: calc(var(--step-5) * 0.25 + var(--step-5));
line-height: calc(var(--step-4) * 0.25 + var(--step-4));
padding-bottom: var(--space-l);
}
h2 {
@ -417,7 +420,7 @@ figure > div > iframe {
border-top-left-radius: 0;
padding: 0;
width: 100%;
box-shadow: var(--space-2xs) var(--space-2xs) 0 0 var(--contrast-color);
/* box-shadow: var(--space-2xs) var(--space-2xs) 0 0 var(--contrast-color); */
}
html.barebones,
@ -429,7 +432,7 @@ body.barebones {
figcaption {
font-size: var(--step--1);
font-style: italic;
padding-top: var(--space-s);
padding-top: var(--space-3xs);
text-align: center;
strong {
font-variation-settings: "wght" 600;
@ -444,7 +447,7 @@ button {
font-variation-settings: var(--font-variation-ui);
letter-spacing: var(--ui-letter-spacing);
margin: var(--space-xl) 0 0 0;
padding: var(--space-2xs) var(--space-xs);
padding: 0 var(--space-xs);
text-transform: uppercase;
transition: var(--transition-normal);
white-space: nowrap;
@ -621,15 +624,16 @@ code {
content: " ";
}
}
hr.footnotes-sep {
hr {
border: var(--border-hr);
width: 100%;
}
/* Dropcap */
main > section > article > p:not(.nodropcap):first-of-type:first-letter {
float: left;
font-size: var(--step-6);
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
font-size: var(--step-5);
padding: var(--space-2xs);
color: var(--contrast-color);
border: solid 2px var(--contrast-color);
font-family: var(--font-family-headline);
@ -721,48 +725,49 @@ nav ul {
}
/* Posts list */
.postlist-item-container {
display: flex;
flex-flow: column nowrap;
gap: var(--space-xl);
}
.postlist-item {
align-items: flex-start;
background-color: var(--card-color);
border-radius: var(--border-radius);
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
padding: var(--space-m) 1.1rem var(--space-m) 1.1rem;
width: 100%;
}
.postlist,
.links-nextprev {
container: postlist / inline-size;
}
.postlist-item {
align-items: flex-start;
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
width: 100%;
}
.postlist-item-container {
display: flex;
flex-flow: column nowrap;
gap: var(--space-s);
}
.post-image {
width: var(--space-4xl);
height: var(--space-4xl);
object-fit: cover;
object-position: 50% 50%;
}
.post-image-container {
border-radius: var(--border-radius);
box-shadow: var(--box-shadow);
height: 15rem;
margin-left: calc(var(--space-l) * -1);
max-height: 15rem;
height: var(--space-4xl);
max-height: var(--space-4xl);
overflow: hidden;
width: 15rem;
width: var(--space-4xl);
}
.postlist-date,
.postlist-item:before {
color: var(--color-gray-90);
font-size: var(--meta-font-size); /* 13px /16 */
font-size: var(--meta-font-size);
/*margin: var(--space-2xs) 0;*/
}
.postlist-date {
word-spacing: -0.5px;
}
.postlist-link {
font-size: var(--step-5); /* 19px /16 */
font-size: var(--step-5);
padding-right: 0.5em;
text-decoration: none;
}
@ -785,53 +790,31 @@ nav ul {
display: flex;
flex-flow: column wrap;
}
.post-image {
width: 15rem;
height: 15rem;
object-fit: cover;
object-position: 50% 50%;
}
sup {
line-height: 0;
}
@container postlist (max-width: 500px) {
.postlist-item {
flex-flow: column wrap;
}
.post-image-container {
margin-left: 0;
margin-top: calc(var(--space-l) * -1);
width: 100%;
}
.post-image-container img.post-image {
width: calc(100cqw - var(--space-m));
}
.postlist-link {
padding: 0;
}
.postlist-link h3 {
padding-top: var(--space-m);
}
.postlist-link p {
margin-top: var(--space-xs);
}
}
/* Tags */
a.post-tag {
color: var(--text-color-tag);
padding-right: var(--space-5xs);
background-color: var(--color-gray-20);
border-radius: 1rem;
color: var(--text-color);
font-family: var(--meta-font-family);
font-variation-settings: "wght" 300;
margin-top: var(--space-3xs);
margin-right: var(--space-3xs);
padding: 0 var(--space-3xs);
text-decoration: none;
}
a.post-tag:before {
content: "#";
}
a.post-tag:visited {
color: var(--text-color-tag);
color: var(--text-color);
}
a.post-tag:hover {
color: var(--text-color-tag);
color: var(--text-color);
}
.tag-feed-icon {
fill: var(--rss-orange);
@ -849,11 +832,10 @@ a.post-tag:hover {
list-style-type: none;
padding-left: 0;
}
.taglist li {
margin: 0em 0.5em 1.25em 0em;
}
.taglist li a {
font-size: var(--step-2);
display: inline-block;
font-size: var(--step--1);
margin: 0 var(--space-2xs) var(--space-2xs) 0;
}
.postlist-item > .post-tag {
@ -871,7 +853,6 @@ a.post-tag:hover {
display: flex;
flex-flow: column nowrap;
justify-content: center;
padding-left: var(--space-s);
}
.post-metadata p,
@ -881,23 +862,50 @@ time,
.metadata {
display: flex;
flex-flow: row wrap;
font-family: var(--meta-font-family);
font-size: var(--meta-font-size);
font-style: var(--meta-font-style);
font-variation-settings: var(--meta-font-variatoin-settings);
line-height: calc(var(--step--1) * 0.5 + var(--step--1));
font-variation-settings: var(--meta-font-variation-settings);
line-height: calc(var(--meta-font-size) * 0.5 + var(--meta-font-size));
list-style: none;
margin: 0;
padding-left: 0em;
}
.post-metadata time {
.post-metadata {
padding-left: 0.15rem;
}
@container postlist (max-width: 500px) {
.postlist-item {
flex-flow: column wrap;
}
.post-image-container {
margin-left: 0;
width: 100%;
}
.post-image-container img.post-image {
width: 100cqw;
}
.postlist-link {
padding: 0;
}
.postlist-link h3 {
padding-top: var(--space-m);
}
.postlist-link p {
margin-top: var(--space-xs);
}
.post-metadata {
padding-bottom: 0;
}
}
.profilePic:not(.links-container > img.profilePic) {
height: var(--space-xl);
width: var(--space-xl);
border-radius: 100%;
height: var(--space-xl);
margin-right: var(--space-s);
width: var(--space-xl);
}
/* Direct Links / Markdown Headers */

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 85 KiB