Compare commits

...

No commits in common. "main" and "gh-pages" have entirely different histories.

316 changed files with 5814 additions and 8850 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

2
.gitignore vendored
View file

@ -1,5 +1,3 @@
dist
node_modules
.plugin-clean
.cache
.11ty-vite

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -1,9 +0,0 @@
## Prerequisites
- node@20
- [mise](https://mise.jdx.dev/) (optional) to install dependencies
## Usage
- Local development: `npm run dev`
- Deploy: `npm run upload`

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

1
about/index.html Normal file

File diff suppressed because one or more lines are too long

View file

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

View file

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

994
assets/feed-Co0rJ30x.xml Normal file
View file

@ -0,0 +1,994 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="/simple-atom.xslt"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
<title>joshua.seigler.net</title>
<subtitle>Personal homepage of Joshua Seigler</subtitle>
<link href="https://joshua.seigler.net/feed.xml" rel="self" />
<link href="https://joshua.seigler.net/" />
<updated>2025-06-28T00:00:00Z</updated>
<id>https://joshua.seigler.net/</id>
<author>
<name></name>
</author>
<entry>
<title>Link: The EU as suicide pact, or: How Germany is slowly dismantling its electrical grid and why the EU won&#39;t let them fix it</title>
<link href="https://www.eugyppius.com/p/the-eu-as-suicide-pact-or-how-germany" />
<updated>2025-07-09T00:18:20Z</updated>
<id>https://www.eugyppius.com/p/the-eu-as-suicide-pact-or-how-germany</id>
<content type="html">
</content>
</entry>
<entry>
<title>Link: Voice of God - The Truth About AI Assistants</title>
<link href="https://backlit.neocities.org/voice-of-god-the-truth-about-ai-assistants.html" />
<updated>2025-07-06T18:32:46Z</updated>
<id>https://backlit.neocities.org/voice-of-god-the-truth-about-ai-assistants.html</id>
<content type="html">&lt;div class=&quot;markdown&quot;&gt;&lt;p&gt;Insightful. Basically claims that AI has been made so convenient (at great expense and effort) because it gives AI providers/operators enormous benefit: control over narrative at unprecedented depth and scale. &lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<title>Link: htmz - a low power tool for html</title>
<link href="https://leanrada.com/htmz/" />
<updated>2025-07-01T19:01:52Z</updated>
<id>https://leanrada.com/htmz/</id>
<content type="html">&lt;div class=&quot;markdown&quot;&gt;&lt;p&gt;Super clever approach for putting HTML into other HTML. &amp;quot;Is it a framework? It&#39;s a snippet.&amp;quot;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<title>Recipe: Chicken Chili Verde</title>
<link href="https://joshua.seigler.net/recipes/chicken-chili-verde/" />
<updated>2025-07-01T00:00:00Z</updated>
<id>https://joshua.seigler.net/recipes/chicken-chili-verde/</id>
<content type="html">&lt;p&gt;Serves six. Prep 20 minutes, cooking time about 1 hour. Mildly spicy. Requires an immersion blender or kitchen blender.&lt;/p&gt;
&lt;h2 id=&quot;ingredients&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/chicken-chili-verde/#ingredients&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1-3 jalapeño peppers&lt;/li&gt;
&lt;li&gt;1 Anaheim or Cubanelle pepper&lt;/li&gt;
&lt;li&gt;6 tomatillos&lt;/li&gt;
&lt;li&gt;2 large chicken breasts&lt;/li&gt;
&lt;li&gt;1 large white onion&lt;/li&gt;
&lt;li&gt;1 head of garlic&lt;/li&gt;
&lt;li&gt;3 cups chicken stock&lt;/li&gt;
&lt;li&gt;2 tsp neutral oil&lt;/li&gt;
&lt;li&gt;Salt&lt;/li&gt;
&lt;li&gt;Pepper&lt;/li&gt;
&lt;li&gt;1 lime&lt;/li&gt;
&lt;li&gt;1 tsp oregano&lt;/li&gt;
&lt;li&gt;Fresh cilantro, optional&lt;/li&gt;
&lt;li&gt;3 cups white rice&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;directions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/chicken-chili-verde/#directions&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Directions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Rough chop the onion. Dice a little bit and set aside for a garnish.&lt;/li&gt;
&lt;li&gt;Add the chicken, 1/3 of the chopped onion, 1/3 of the garlic, and the chicken broth to a small pot. Boil, then simmer covered for 45 minutes.&lt;/li&gt;
&lt;li&gt;While that cooks, deseed the peppers.&lt;/li&gt;
&lt;li&gt;In a sauté pan over medium-high heat, sear the peppers, tomatillos, and the rest of the garlic and chopped onion in about 2 tsp of oil. Stir the pan intermittently until the veggies are softened and seared, about 15 minutes.&lt;/li&gt;
&lt;li&gt;Set aside the seared veggies. Cook the rice by your preferred method.&lt;/li&gt;
&lt;li&gt;When the chicken is done simmering, remove the breasts and add the broth, onions, etc to the veggies.&lt;/li&gt;
&lt;li&gt;Add to the mixture half the lime juice, and salt, pepper, oregano, and cilantro.&lt;/li&gt;
&lt;li&gt;Blend until very smooth.&lt;/li&gt;
&lt;li&gt;Shred the chicken breasts with forks and add to the mixture.&lt;/li&gt;
&lt;li&gt;Heat the mixture, covered, over medium heat for 15 minutes.&lt;/li&gt;
&lt;li&gt;Serve over rice and garnish with diced onion and lime juice.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/chicken-chili-verde/#notes&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Notes&lt;/h2&gt;
&lt;p&gt;You can use jarred minced garlic instead of fresh, just delay adding it when you char the veggies because it will burn easily.&lt;br&gt;
Original recipe from &lt;a href=&quot;https://www.tiktok.com/@oldscoolkevmo/video/7520712000826133791&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Kevin Ashton&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;nutrition-information&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/chicken-chili-verde/#nutrition-information&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Nutrition Information&lt;/h2&gt;
&lt;p&gt;Makes 6 389g servings. Each serving: &lt;strong&gt;Calories&lt;/strong&gt;: 558kcal (26%), &lt;strong&gt;Protein&lt;/strong&gt;: 28.18g (52%), &lt;strong&gt;Total Fat&lt;/strong&gt;: 11.64g (24%), Cholesterol: 64mg, Saturated Fat: 3g, Trans Fat: 0.11g, &lt;strong&gt;Carbohydrates&lt;/strong&gt;: 82.35g (34%), Dietary Fiber: 3.9g (16%), Sugars: 3.11g, &lt;strong&gt;Calcium&lt;/strong&gt;: 45mg (5%), &lt;strong&gt;Iron&lt;/strong&gt;: 2.72mg (15%), &lt;strong&gt;Potassium&lt;/strong&gt;: 474mg (10%), &lt;strong&gt;Sodium&lt;/strong&gt;: 584mg (39%)&lt;/p&gt;
</content>
</entry>
<entry>
<title>Link: Speed Catan - seanmcp.com</title>
<link href="https://www.seanmcp.com/board-games/speed-catan/" />
<updated>2025-06-29T03:05:58Z</updated>
<id>https://www.seanmcp.com/board-games/speed-catan/</id>
<content type="html">&lt;div class=&quot;markdown&quot;&gt;&lt;blockquote&gt;
&lt;p&gt;Speed Catan is a variation of the popular board game Catan that emphasizes game speed and simplicity for younger (or impatient) players.&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<title>Link: How to Surf the Web in 2025, and Why You Should</title>
<link href="https://www.raptitude.com/2025/06/how-to-surf-the-web-in-2025-and-why-you-should/" />
<updated>2025-06-28T22:20:45Z</updated>
<id>https://www.raptitude.com/2025/06/how-to-surf-the-web-in-2025-and-why-you-should/</id>
<content type="html">&lt;div class=&quot;markdown&quot;&gt;&lt;blockquote&gt;
&lt;p&gt;Just as its still possible (though seldom necessary) to ride a horse, it is still possible to surf the internet. Its a thrill not yet lost to time.&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<title>Post: Alternate rules for Bananagrams</title>
<link href="https://joshua.seigler.net/posts/alternate-rules-for-bananagrams/" />
<updated>2025-06-28T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/alternate-rules-for-bananagrams/</id>
<content type="html">&lt;p&gt;Digging through old bookmarks I found this alternate ruleset for Bananagrams I want to share:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Turn all letter tiles face down, then each player takes 10 tiles (with 3 players take 14 tiles, with 5 players take 8). Someone says “GO” and everyone turns over their tiles and tries to build their own crossword using ALL their letters, no two letter words allowed. When someone finally finishes they say “DONE” and they get -1 to their final score marked on a scorepad. Now ALL players pick FOUR more tiles and again try to use them all with any left over from the last round. Players are allowed to mix up their words at any point in the game, add to them, etc just like Bananagrams. If no one can go out and all players agree, they skip scoring that round and pull 4 more tiles and carry on. This should rarely happen.&lt;/p&gt;
&lt;p&gt;If at the time of picking someone has 3 tiles all the same, they can immediately and only at this time, throw the 3 tiles back and take 3 new ones.&lt;/p&gt;
&lt;p&gt;This continues round by round until the tiles are gone, then whoever finishes first in the very last round gets -3 to their score instead of the usual -1.&lt;/p&gt;
&lt;p&gt;Endgame Scoring: Each word is +3 to score and each unused tile is +2 to score. LONGEST word is -4, if tied look at next longest. Lowest score is the winner.&lt;/p&gt;
&lt;p&gt;There is more than one strategy here. Fast and furious can win but also just making long words and as few as possible can win too, if you want to push your luck. I have seen games won where the person had 8 tiles left over (+16) but only had 3 words (+9) and ended up with the longest word (-4) and won the game. Played this way the game is fun, tense and addicting.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reproduced with light editing from &lt;a href=&quot;https://boardgamegeek.com/thread/563175/article/5516061#5516061&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Houserule Jay @ BoardGameGeek&lt;/a&gt;&lt;/p&gt;
</content>
</entry>
<entry>
<title>Link: Comic Helvetic Font | dafont.com</title>
<link href="https://www.dafont.com/comic-helvetic.font" />
<updated>2025-06-26T14:29:51Z</updated>
<id>https://www.dafont.com/comic-helvetic.font</id>
<content type="html">&lt;div class=&quot;markdown&quot;&gt;&lt;p&gt;I don&#39;t understand why this feels ok but Comic Sans makes my skin crawl.&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<title>Post: FFmpeg audio cleanup</title>
<link href="https://joshua.seigler.net/posts/ffmpeg-audio-cleanup/" />
<updated>2025-06-26T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/ffmpeg-audio-cleanup/</id>
<content type="html">&lt;p&gt;I recently needed to process 20+ phone audio recordings. The files are mp3 recordings in stereo, made in an environment with echoes and noise from fans/heaters.&lt;/p&gt;
&lt;p&gt;Although I could do it easily with &lt;a href=&quot;https://tenacityaudio.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tenacity&lt;/a&gt; I didnt want to use a manual process, since it would take days. So I tried using FFmpeg filters and Bash scripting.&lt;/p&gt;
&lt;p&gt;I found an FFmpeg filter called &lt;a href=&quot;https://ffmpeg.org/ffmpeg-filters.html#compand&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;compand&lt;/a&gt; which lets you map an input decibel range to an output decibel range. I also used the &lt;a href=&quot;https://ffmpeg.org/ffmpeg-filters.html#anlmdn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;anlmdn&lt;/a&gt; filter to reduce noise, and the &lt;a href=&quot;https://ffmpeg.org/ffmpeg-filters.html#highpass&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;highpass&lt;/a&gt; filter to help with clarity.&lt;/p&gt;
&lt;p&gt;I ran into a couple gotchas.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;mpv&lt;/code&gt; does something special for audio playback that prevents audio from clipping. &lt;code&gt;vlc&lt;/code&gt; plays the file as it is.&lt;/li&gt;
&lt;li&gt;Because the compressor has an attack and decay (which is necessary for things to sound good) it can cause clipping if the volume rises sharply. Applying a &lt;code&gt;delay&lt;/code&gt; parameter with half the duration of the attack length fixed this.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here is the script:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;process-audio.sh&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$#&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Error: no arguments provided.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Usage: &lt;span class=&quot;token variable&quot;&gt;$0&lt;/span&gt; file1 file2 file3 ...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;or &lt;span class=&quot;token variable&quot;&gt;$0&lt;/span&gt; *.ext&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;trap&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;exit&quot;&lt;/span&gt; INT&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$#&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${1&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;*}&lt;/span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${1&lt;span class=&quot;token operator&quot;&gt;##&lt;/span&gt;*&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;}&lt;/span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;outfile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;./normalized--&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$outfile&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Processing &lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; warning &lt;span class=&quot;token parameter variable&quot;&gt;-ac&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-af&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;compand=attacks=0.3:decays=0.3:delay=0.15:points=-80/-300|-45/-25|-27/-15|0/-12|20/-12,anlmdn=s=10,highpass=f=500&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-threads&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$outfile&lt;/span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Skipping &lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;, already processed.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;shift&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If this is useful to you please leave a comment or send an email, I would love to hear about it.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Post: War</title>
<link href="https://joshua.seigler.net/posts/july-21-2025/" />
<updated>2025-06-21T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/july-21-2025/</id>
<content type="html">&lt;p&gt;Today the USA announced its bombing of three locations in Iran, including Irans main nuclear enrichment site, located under a mountain in Fordow. How far will things go?&lt;/p&gt;
&lt;p&gt;Here is the only way I know of to have peace: live every day as if tomorrow you will face death, where it will be too late for repentance, too late for a change of heart. As St. Isaac the Syrian says&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://joshua.seigler.net/posts/july-21-2025/#footnote1&quot;&gt;[1]&lt;/a&gt;&lt;a class=&quot;footnote-anchor&quot; id=&quot;footnote-ref1&quot;&gt;&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;blockquote class=&quot;feature&quot;&gt;
&lt;p&gt;Take hold of your life before your light grows dark and you seek help and do not find it. This life has been given to you for repentance; do not waste it in vain pursuits.&lt;/p&gt;
&lt;p&gt;Woe to us! We neither realize just how valuable our soul is, nor comprehend the type of life we have been called to lead. We place great significance on this present life, on illnesses, on the state of society, and on the sorrows, evils, and comforts of this world.&lt;/p&gt;
&lt;p&gt;However, blessed is the person, O Lord Jesus Christ, who receives help from You. You, O Lord, are the only powerful One. Turn our faces away from the desire for this world so that we may covet You alone. Grant us, O Lord, understanding, so that we may comprehend just how deceitful this present world is, and so that we do not believe in this shadow as if it were the truth.&lt;/p&gt;
&lt;p&gt;Seek the Lord, and be strengthened through hope. Seek His face through repentance, and you will be sanctified and cleansed from your sins, on account of the sanctity of His face. Hasten to the Lord, all of you who are guilty of sins, for He is able to forgive sins and overlook mistakes. For He made an oath and declared thus: &lt;em&gt;“I live, says the Lord. I do not desire the death of the sinner until he repents from his evil way and lives” (Ez. 13:23)&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;May we not be tested beyond what we can bear, and may we have indestructible peace that is not of this world.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;footnote1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Quote copied from &lt;a href=&quot;https://www.stnektariosmonastery.org/repentance-and-confession/This%20Life%20Has%20Been%20Given%20to%20Us%20for%20Repentance%20-%20St.%20Isaac%20the%20Syrian.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;St. Nectarios Monastery&lt;/a&gt; and &lt;a href=&quot;https://orthodoxwiki.org/Isaac_of_Syria&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OrthodoxWiki&lt;/a&gt; &lt;a href=&quot;https://joshua.seigler.net/posts/july-21-2025/#footnote-ref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>
</entry>
<entry>
<title>Link: NIKA:&#92;git-revise&#92;&gt;</title>
<link href="https://mystor.github.io/git-revise.html" />
<updated>2025-06-18T16:18:36Z</updated>
<id>https://mystor.github.io/git-revise.html</id>
<content type="html">&lt;div class=&quot;markdown&quot;&gt;&lt;p&gt;git-revise is a history editing tool designed for the patch-stack workflow. It&#39;s fast, non-destructive, and aims to provide a familiar, powerful, and easy to use re-imagining of the patch stack workflow.&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<title>Link: Markdown Code Blocks With a Title / Filename - Lusitos Tech Blog</title>
<link href="https://blog.lusito.info/markdown-code-blocks-with-a-title-filename.html" />
<updated>2025-06-15T02:28:23Z</updated>
<id>https://blog.lusito.info/markdown-code-blocks-with-a-title-filename.html</id>
<content type="html">&lt;div class=&quot;markdown&quot;&gt;&lt;p&gt;Smart alternative to immediately using some kind of markdown extension or plugin. Good perspective.&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<title>Post: My Very Own GitHub Pages</title>
<link href="https://joshua.seigler.net/posts/my-very-own-github-pages/" />
<updated>2025-06-15T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/my-very-own-github-pages/</id>
<content type="html">&lt;p&gt;I recently started self-hosting &lt;a href=&quot;https://forgejo.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Forgejo&lt;/a&gt;, but I wanted something to replace GitHub pages, which has been very convenient for publishing little website projects. My server runs Debian, so I decided to use &lt;a href=&quot;https://github.com/adnanh/webhook&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;webhook&lt;/a&gt; and &lt;a href=&quot;https://caddyserver.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Caddy&lt;/a&gt;. Im very happy how it turned out.&lt;/p&gt;
&lt;h2 id=&quot;the-objective&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/my-very-own-github-pages/#the-objective&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; The objective&lt;/h2&gt;
&lt;p&gt;When I push a &lt;code&gt;gh-pages&lt;/code&gt; branch to any public repository on my Forgejo instance, the name of the repo is used as a domain name (e.g. &lt;a href=&quot;https://marklink.pages.seigler.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;marklink.pages.seigler.net&lt;/a&gt;) and the branch contents are automatically served with SSL. If I push updates to the branch, they are automatically published. If the branch or repo is deleted, the site is taken down.&lt;/p&gt;
&lt;h2 id=&quot;how-to-do-it&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/my-very-own-github-pages/#how-to-do-it&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; How to do it&lt;/h2&gt;
&lt;h3 id=&quot;debian-server-preparation&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/my-very-own-github-pages/#debian-server-preparation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Debian server preparation&lt;/h3&gt;
&lt;p&gt;In case you dont have a basic server setup routine yet, this is a good start:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the default root password.&lt;/li&gt;
&lt;li&gt;Create a new user and add it to the sudo group. In my examples below the user is &lt;code&gt;joshua&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;ssh-copy-id&lt;/code&gt; to install your ssl pubkey for easier login.&lt;/li&gt;
&lt;li&gt;Disable/lock roots password.&lt;/li&gt;
&lt;li&gt;Disable root login over ssh and change the SSL port number. Pick a new port lower than 1024.&lt;/li&gt;
&lt;li&gt;Edit your local &lt;code&gt;~/.ssh/config&lt;/code&gt; so you dont have to specify the port number every time you connect.&lt;/li&gt;
&lt;li&gt;On the server, install and enable &lt;code&gt;ufw&lt;/code&gt; and &lt;code&gt;fail2ban&lt;/code&gt;. In addition to allowing your custom SSL port, be sure to enable ports 80 and 443 with &lt;code&gt;sudo ufw allow &amp;quot;WWW Full&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;caddy&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/my-very-own-github-pages/#caddy&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Caddy&lt;/h3&gt;
&lt;p&gt;I usually use nginx, but I wanted to give Caddy a shot, and it has been a great experience. I installed Caddy using the &lt;a href=&quot;https://caddyserver.com/docs/install&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;official instructions&lt;/a&gt;.&lt;br&gt;
Here is the Caddyfile I made—you will need to change the domain names and the email. Email could be removed, but it is there so that SSL certificate issuers can contact you if there is a problem with your certificates.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/caddy/Caddyfile&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-caddy&quot;&gt;&lt;code class=&quot;language-caddy&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;# Global options block&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; email you@example.com #### CHANGE THIS ####&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; on_demand_tls {&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; ask http://localhost/check&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; }&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;# Webhooks&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;https://webhooks.subdomain.here.tld { #### CHANGE THIS ####&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; reverse_proxy localhost:9000&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;# Filter for which SSL certs we will create. Prevents abuse.&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;http://localhost {&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; handle /check {&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; root * /var/www&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; @deny not file /{query.domain}/&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; respond @deny 404&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; }&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;# This automatically handles upgrading http:// requests with a redirect&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;https:// {&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; tls {&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; on_demand&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; }&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; root /var/www&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; rewrite /{host}{uri}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; @forbidden {&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; path /.*&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; }&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; respond @forbidden 404&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; file_server&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;# Refer to the Caddy docs for more information:&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;# https://caddyserver.com/docs/caddyfile&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;# This config based on information at&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;# https://caddy.community/t/on-demand-tls-with-dynamic-content-paths/18140&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;# checked and corrected with `caddy validate`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I also took ownership of &lt;code&gt;/var/www&lt;/code&gt; with &lt;code&gt;chown -R joshua:joshua /var/www&lt;/code&gt; since the webhooks will run as my login account.&lt;/p&gt;
&lt;h3 id=&quot;webhooks&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/my-very-own-github-pages/#webhooks&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Webhooks&lt;/h3&gt;
&lt;p&gt;In my home directory I defined two hook scripts:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/webhooks/update-pages.sh&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# parameter 1 is repo name, parameter 2 is clone url&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;..&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;*&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/var/www/&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/var/www/&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; fetch origin gh-pages&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; reset &lt;span class=&quot;token parameter variable&quot;&gt;--hard&lt;/span&gt; origin/gh-pages&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone &lt;span class=&quot;token parameter variable&quot;&gt;-b&lt;/span&gt; gh-pages --single-branch &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;~/webhooks/remove-pages.sh&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# parameter 1 is repo name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;..&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;*&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/var/www/&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/var/www&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-rf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/var/www/&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To trigger these hooks I am using &lt;code&gt;webhook&lt;/code&gt; which is in the default Debian repository.&lt;/p&gt;
&lt;p&gt;Here are the hook definitions: one for creating/updating a site, and one for deleting. You will need to generate one or two secret values that the server can use to know that the webhook is authorized to run. I used linux command &lt;code&gt;uuidgen -r&lt;/code&gt; to create mine. Save these values so you can enter them in Forgejo later.&lt;/p&gt;
&lt;p&gt;Also make sure to replace your execute-command lines with ones referencing your username and script paths.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/webhook.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;update-pages&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;execute-command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/usr/bin/sudo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;pass-arguments-to-command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-u&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;joshua&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/home/joshua/webhooks/update-pages.sh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;payload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;repository.name&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;payload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;repository.clone_url&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;trigger-rule&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;and&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;match&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;payload-hmac-sha256&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;secret&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;(omitted)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;parameter&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;header&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;X-Forgejo-Signature&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;match&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;refs/heads/gh-pages&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;parameter&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;payload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ref&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;remove-pages&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;execute-command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/usr/bin/sudo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;pass-arguments-to-command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-u&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;joshua&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/home/joshua/webhooks/remove-pages.sh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;payload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;repository.name&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;trigger-rule&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;and&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;match&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;payload-hmac-sha256&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;secret&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;(omitted)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;parameter&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;header&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;X-Forgejo-Signature&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;forgejo&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/my-very-own-github-pages/#forgejo&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Forgejo&lt;/h3&gt;
&lt;p&gt;Forgejo supports running webhooks conditionally triggered by certain conditions.&lt;br&gt;
Under my main user settings I set up each webhook:&lt;/p&gt;
&lt;h4 id=&quot;update-pages&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/my-very-own-github-pages/#update-pages&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Update pages&lt;/h4&gt;
&lt;p&gt;Target URL: https:// &lt;em&gt;your domain here&lt;/em&gt; /hooks/update-pages&lt;br&gt;
HTTP Method: &lt;code&gt;POST&lt;/code&gt; (the default)&lt;br&gt;
POST content type: &lt;code&gt;application/json&lt;/code&gt; (the default)&lt;br&gt;
Secret: &lt;em&gt;omitted, use your own&lt;/em&gt;&lt;br&gt;
Trigger on: Push events&lt;br&gt;
Branch filter: &lt;code&gt;gh-pages&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&quot;remove-pages&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/my-very-own-github-pages/#remove-pages&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Remove pages&lt;/h4&gt;
&lt;p&gt;Target URL: https:// &lt;em&gt;your domain here&lt;/em&gt; /hooks/remove-pages&lt;br&gt;
HTTP Method: &lt;code&gt;POST&lt;/code&gt; (the default)&lt;br&gt;
POST content type: &lt;code&gt;application/json&lt;/code&gt; (the default)&lt;br&gt;
Secret: &lt;em&gt;omitted, use your own&lt;/em&gt;&lt;br&gt;
Trigger on: Custom Events &amp;gt; Repository &amp;gt; Delete&lt;br&gt;
Branch filter: &lt;code&gt;gh-pages&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/my-very-own-github-pages/#conclusion&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Conclusion&lt;/h2&gt;
&lt;p&gt;It works!&lt;br&gt;
Here is &lt;a href=&quot;https://git.apps.seigler.net/joshua/marklink.pages.seigler.net&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;the marklink repo in my Forgejo instance&lt;/a&gt; and &lt;a href=&quot;https://marklink.pages.seigler.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;its contents on my Caddy server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That repo is just HTML and JS with only a gh-pages branch, but for repos with npm build scripts, I use &lt;a href=&quot;https://www.npmjs.com/package/gh-pages&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;gh-pages @ npm&lt;/a&gt; to push the build to a gh-pages branch and up to the server.&lt;/p&gt;
&lt;p&gt;Im putting off rolling my own CI server, but I imagine thats the next stage here. Stay tuned.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Link: MidWord! The world&#39;s favorite word guessing game</title>
<link href="https://midword.com/" />
<updated>2025-06-14T04:28:49Z</updated>
<id>https://midword.com/</id>
<content type="html">&lt;div class=&quot;markdown&quot;&gt;&lt;p&gt;Just found my new favorite long-car-ride verbal game!&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<title>Recipe: Amish Egg Noodles</title>
<link href="https://joshua.seigler.net/recipes/amish-egg-noodles/" />
<updated>2025-06-13T00:00:00Z</updated>
<id>https://joshua.seigler.net/recipes/amish-egg-noodles/</id>
<content type="html">&lt;h2 id=&quot;ingredients&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/amish-egg-noodles/#ingredients&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;6 tablespoons butter, divided&lt;/li&gt;
&lt;li&gt;28 ounces chicken broth&lt;/li&gt;
&lt;li&gt;1 chicken bouillon cube&lt;/li&gt;
&lt;li&gt;12 ounces extra wide egg noodles&lt;/li&gt;
&lt;li&gt;1 teaspoon parsley flakes&lt;/li&gt;
&lt;li&gt;Salt and pepper, to taste&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instructions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/amish-egg-noodles/#instructions&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Instructions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;In a large pan, brown two tablespoons of butter over medium heat.&lt;/li&gt;
&lt;li&gt;Pour the chicken stock and bouillon cube into the pan and bring to a boil.&lt;/li&gt;
&lt;li&gt;Add the egg noodles to the chicken stock and return to a boil. Cover the pot and remove from the heat.&lt;/li&gt;
&lt;li&gt;Let the noodles set for 30 minutes, stirring every 10 minutes or so.&lt;/li&gt;
&lt;li&gt;Test the noodles for doneness. If they are not cooked through, turn the heat back on and cook for 1-2 minutes until noodles are tender.&lt;/li&gt;
&lt;li&gt;Top with the remaining 4 tablespoons of butter, parsley, and salt and pepper to taste.&lt;/li&gt;
&lt;li&gt;Serve immediately or leave in the pan, covered, until ready to serve. These will stay warm for 20 more minutes or so with no problems.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/amish-egg-noodles/#notes&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Notes&lt;/h2&gt;
&lt;p&gt;We use 4.5 tsp of Better than Bouillon with 28oz water, replacing the broth and bouillon cube.&lt;br&gt;
We also usually brown some canned chicken and add it at the same time as the butter and seasonings.&lt;/p&gt;
&lt;p&gt;Original recipe from &lt;a href=&quot;https://www.bunsinmyoven.com/amish-egg-noodles/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;bunsinmyoven&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;nutrition-information&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/amish-egg-noodles/#nutrition-information&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Nutrition Information&lt;/h2&gt;
&lt;p&gt;Makes 6 servings. Each serving:&lt;br&gt;
&lt;strong&gt;Calories&lt;/strong&gt; 328kcal (16%), &lt;strong&gt;Total Fat&lt;/strong&gt; 14g (22%), Saturated Fat 7g (44%), Cholesterol 77mg (26%), &lt;strong&gt;Sodium&lt;/strong&gt; 758mg (33%), &lt;strong&gt;Total Carbohydrates&lt;/strong&gt; 41g (14%), Dietary Fiber 2g (8%), Sugar 1g (1%), &lt;strong&gt;Protein&lt;/strong&gt; 9g (18%), &lt;strong&gt;Vitamin C&lt;/strong&gt; 10.3mg (12%), &lt;strong&gt;Vitamin A&lt;/strong&gt; 400IU (8%), &lt;strong&gt;Iron&lt;/strong&gt; 1.5mg (8%), &lt;strong&gt;Calcium&lt;/strong&gt; 41mg (4%), &lt;strong&gt;Potassium&lt;/strong&gt; 266mg (8%)&lt;/p&gt;
</content>
</entry>
<entry>
<title>Link: Verissimo Monthly - May 2025 - by Binyamin Grobman</title>
<link href="https://verissimo.substack.com/p/verissimo-monthly-may-2025" />
<updated>2025-06-03T17:39:50Z</updated>
<id>https://verissimo.substack.com/p/verissimo-monthly-may-2025</id>
<content type="html">&lt;div class=&quot;markdown&quot;&gt;&lt;p&gt;The Unreliability of LLMs &amp;amp; What Lies Ahead&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<title>Link: Keeping up appearances | deadSimpleTech</title>
<link href="https://deadsimpletech.com/blog/keeping_up_appearances" />
<updated>2025-05-31T04:02:35Z</updated>
<id>https://deadsimpletech.com/blog/keeping_up_appearances</id>
<content type="html">&lt;div class=&quot;markdown&quot;&gt;&lt;p&gt;The only reason that LLMs took root in the first place was because our societies in the anglosphere have already developed cultures solely devoted to gaining status and keeping up the appearance of doing things rather than actually doing them. All other values, increasingly including even the accumulation of wealth (while this is still very much a thing that people pursue, wealth is increasingly becoming a proxy for status more than something desired in itself) are becoming subordinated to symbolic status games completely detached from anything real.&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<title>Recipe: Perfect Homemade Brownies</title>
<link href="https://joshua.seigler.net/recipes/perfect-homemade-brownies/" />
<updated>2025-05-20T00:00:00Z</updated>
<id>https://joshua.seigler.net/recipes/perfect-homemade-brownies/</id>
<content type="html">&lt;h2 id=&quot;ingredients&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/perfect-homemade-brownies/#ingredients&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 cup butter&lt;/li&gt;
&lt;li&gt;2 1/4 cups sugar&lt;/li&gt;
&lt;li&gt;4 large eggs&lt;/li&gt;
&lt;li&gt;1 1/4 cups cocoa powder&lt;/li&gt;
&lt;li&gt;1 teaspoon salt&lt;/li&gt;
&lt;li&gt;1 teaspoon baking powder&lt;/li&gt;
&lt;li&gt;1 teaspoon espresso powder (optional)&lt;/li&gt;
&lt;li&gt;1 tablespoon vanilla extract&lt;/li&gt;
&lt;li&gt;1 1/2 cups all-purpose flour&lt;/li&gt;
&lt;li&gt;2 cups semi-sweet chocolate chips&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instructions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/perfect-homemade-brownies/#instructions&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Instructions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Pre-heat the oven to 350 degrees. Butter a 9×13 baking dish.&lt;/li&gt;
&lt;li&gt;In small saucepan over low heat, melt butter completely. Stir in sugar and continue cooking for 1-2 minutes, stirring constantly. Do not allow sugar mixture to boil.&lt;/li&gt;
&lt;li&gt;Pour butter mixture into a large bowl or stand mixer, and cool for 2 minutes. Beat in cocoa powder, eggs, salt, baking powder, espresso powder, and vanilla extract. Mix until well combined.&lt;/li&gt;
&lt;li&gt;Stir in the flour and chocolate chips until well combined.&lt;/li&gt;
&lt;li&gt;Spread into prepared pan (batter will be very thick and sticky) and bake for about 30 minutes, until a tester comes out mostly clean. The edges should be set and the center should still look slightly moist, but not uncooked. Cool on a wire rack.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/perfect-homemade-brownies/#notes&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Notes&lt;/h2&gt;
&lt;p&gt;Original recipe from &lt;a href=&quot;https://www.bunsinmyoven.com/good-ol-homemade-brownies/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Buns In My Oven&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;nutrition-information&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/perfect-homemade-brownies/#nutrition-information&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Nutrition Information&lt;/h2&gt;
&lt;p&gt;16 servings. Each serving: &lt;strong&gt;Calories&lt;/strong&gt; 419kcal (21%) &lt;strong&gt;Carbohydrates&lt;/strong&gt; 53g (18%) &lt;strong&gt;Protein&lt;/strong&gt; 5g (10%) &lt;strong&gt;Fat&lt;/strong&gt; 22g (34%) &lt;strong&gt;Saturated Fat&lt;/strong&gt; 13g (81%) &lt;strong&gt;Cholesterol&lt;/strong&gt; 78mg (26%) &lt;strong&gt;Sodium&lt;/strong&gt; 268mg (12%) &lt;strong&gt;Potassium&lt;/strong&gt; 290mg (8%) &lt;strong&gt;Fiber&lt;/strong&gt; 4g (17%) &lt;strong&gt;Sugar&lt;/strong&gt; 36g (40%) &lt;strong&gt;Vitamin A&lt;/strong&gt; 435IU (9%) &lt;strong&gt;Calcium&lt;/strong&gt; 46mg (5%) &lt;strong&gt;Iron&lt;/strong&gt; 3.2mg (18%)&lt;/p&gt;
</content>
</entry>
<entry>
<title>Recipe: Pasta Rosatella</title>
<link href="https://joshua.seigler.net/recipes/pasta-rosatella/" />
<updated>2025-05-20T00:00:00Z</updated>
<id>https://joshua.seigler.net/recipes/pasta-rosatella/</id>
<content type="html">&lt;h2 id=&quot;ingredients&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/pasta-rosatella/#ingredients&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1lb any pasta&lt;/li&gt;
&lt;li&gt;2 cups (approximate) garlic &amp;amp; herb pasta sauce&lt;/li&gt;
&lt;li&gt;1½ cups milk&lt;/li&gt;
&lt;li&gt;2 tablespoons flour&lt;/li&gt;
&lt;li&gt;2 tablespoons oil&lt;/li&gt;
&lt;li&gt;Salt and pepper&lt;/li&gt;
&lt;li&gt;Grated Parmesan cheese&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instructions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/pasta-rosatella/#instructions&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Instructions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Cook the pasta according to the package directions.&lt;/li&gt;
&lt;li&gt;Meanwhile in a saucepan, whisk together the oil and flour over medium heat to form a roux. Cook for 12 minutes until lightly golden.&lt;/li&gt;
&lt;li&gt;Slowly whisk in the milk to make a béchamel and continue stirring until thickened.&lt;/li&gt;
&lt;li&gt;Season with salt and pepper, and add cheese.&lt;/li&gt;
&lt;li&gt;Stir in the pasta sauce and let the mixture simmer on low.&lt;/li&gt;
&lt;li&gt;When the pasta is done cooking, drain it, then top with the sauce and extra cheese to serve.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/pasta-rosatella/#notes&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Notes&lt;/h2&gt;
&lt;p&gt;The recipe works the same with almond milk and vegan mozarella replacing the existing dairy.&lt;/p&gt;
&lt;p&gt;Original recipe from &lt;a href=&quot;https://www.tiktok.com/@dollartreedinners/video/7499238134434123051&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;dollartreedinners&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;nutrition-information&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/pasta-rosatella/#nutrition-information&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Nutrition Information&lt;/h2&gt;
&lt;p&gt;Makes 4 servings. Each serving:&lt;br&gt;
&lt;strong&gt;Calories&lt;/strong&gt; 626kcal (31%) &lt;strong&gt;Total Fat&lt;/strong&gt; 14.1g (18%) &lt;strong&gt;Saturated Fat&lt;/strong&gt; 4.4g (22%) &lt;strong&gt;Trans Fat&lt;/strong&gt; 0.19g &lt;strong&gt;Cholesterol&lt;/strong&gt; 18.1mg (6%) &lt;strong&gt;Sodium&lt;/strong&gt; 980.9mg (41%) &lt;strong&gt;Total Carbohydrate&lt;/strong&gt; 100g (36%) &lt;strong&gt;Dietary Fiber&lt;/strong&gt; 4.8g (17%) &lt;strong&gt;Total Sugars&lt;/strong&gt; 10.7g (21%) &lt;strong&gt;Protein&lt;/strong&gt; 22.8g (46%) &lt;strong&gt;Vitamin C&lt;/strong&gt; 2.6mg (3%) &lt;strong&gt;Vitamin D&lt;/strong&gt; 1.2mcg (6%) &lt;strong&gt;Iron&lt;/strong&gt; 4.8mg (27%) &lt;strong&gt;Calcium&lt;/strong&gt; 242.6mg (19%) &lt;strong&gt;Potassium&lt;/strong&gt; 642.7mg (14%) &lt;strong&gt;Phosphorus&lt;/strong&gt; 381.7mg (31%)&lt;/p&gt;
</content>
</entry>
<entry>
<title>Recipe: Creamy Chicken Orzo</title>
<link href="https://joshua.seigler.net/recipes/creamy-chicken-orzo/" />
<updated>2025-05-20T00:00:00Z</updated>
<id>https://joshua.seigler.net/recipes/creamy-chicken-orzo/</id>
<content type="html">&lt;h2 id=&quot;ingredients&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/creamy-chicken-orzo/#ingredients&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2 boneless skinless chicken breasts, cooked and diced&lt;/li&gt;
&lt;li&gt;8 ounces Orzo pasta&lt;/li&gt;
&lt;li&gt;2 celery stalks, finely diced&lt;/li&gt;
&lt;li&gt;2 carrots, finely diced&lt;/li&gt;
&lt;li&gt;1/2 yellow onion, finely diced&lt;/li&gt;
&lt;li&gt;5 tablespoons butter&lt;/li&gt;
&lt;li&gt;2 tablespoons olive oil&lt;/li&gt;
&lt;li&gt;2 cups chicken broth&lt;/li&gt;
&lt;li&gt;½ cup heavy whipping cream&lt;/li&gt;
&lt;li&gt;1 teaspoon chicken bouillon powder&lt;/li&gt;
&lt;li&gt;1/3 cup all purpose flour&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instructions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/creamy-chicken-orzo/#instructions&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Instructions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Cook the Orzo per the package instructions.&lt;/li&gt;
&lt;li&gt;While that cooks, make a mirepoix:
&lt;ol&gt;
&lt;li&gt;In a large skillet over medium high heat add the butter and olive oil.&lt;/li&gt;
&lt;li&gt;Once the butter is melted add in the diced onion, carrots and celery.&lt;/li&gt;
&lt;li&gt;Allow the veggies to sauté for 4-5 minutes until they start to soften up.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Reduce the heat to low and sprinkle the all-purpose flour over the veggies and whisk together until it forms a paste/roux. While stirring constantly, allow the roux to cook for 2-3 minutes.&lt;/li&gt;
&lt;li&gt;Pour into the roux the chicken broth, chicken boullion powder, and heavy whipping cream. Whisk together until no clumps are present and the mixture starts to thicken.&lt;/li&gt;
&lt;li&gt;Add in the diced chicken and allow the mixture to simmer until it reaches desired thickness. Pour in drained orzo and stir to combine. Serve &amp;amp; enjoy!&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/creamy-chicken-orzo/#notes&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Notes&lt;/h2&gt;
&lt;p&gt;You can use rotisserie chicken or cook your own chicken for this recipe. If you use a rotisserie chicken then no additional seasonings are needed, but if you are planning to cook your own chicken then you will need to season it to your liking. I typically use a blend of onion powder, garlic powder, paprika, salt and black pepper.&lt;/p&gt;
&lt;p&gt;Original recipe from &lt;a href=&quot;https://cookingwithkatiecross.com/creamy-chicken-pot-pie-orzo/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cooking with Katie Cross&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;nutrition-information&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/creamy-chicken-orzo/#nutrition-information&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Nutrition Information&lt;/h2&gt;
&lt;p&gt;Makes 5 servings, 1700g. Each 340g serving:&lt;br&gt;
&lt;strong&gt;Calories&lt;/strong&gt; 496kcal (25%), &lt;strong&gt;Total Fat&lt;/strong&gt; 21g (32%), Saturated Fat 9g (45%), Trans Fat 0g, &lt;strong&gt;Cholesterol&lt;/strong&gt; 102mg (34%), &lt;strong&gt;Sodium&lt;/strong&gt; 504mg (21%), &lt;strong&gt;Total Carbohydrates&lt;/strong&gt; 45g (15%), Dietary Fiber 3g (13%), Sugars 3g, &lt;strong&gt;Protein&lt;/strong&gt; 30g (60%), &lt;strong&gt;Vitamin A&lt;/strong&gt; 4646IU, &lt;strong&gt;Vitamin C&lt;/strong&gt; 3mg, &lt;strong&gt;Calcium&lt;/strong&gt; 78mg, &lt;strong&gt;Iron&lt;/strong&gt; 2mg, &lt;strong&gt;Potassium&lt;/strong&gt; 442mg&lt;/p&gt;
</content>
</entry>
<entry>
<title>Post: Tools of the trade</title>
<link href="https://joshua.seigler.net/posts/tools-of-the-trade/" />
<updated>2025-05-15T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/tools-of-the-trade/</id>
<content type="html">&lt;p&gt;Everyone has different tools that they find especially effective. Here are some I have found with a few words about why I like them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Update: I made a &lt;a href=&quot;https://joshua.seigler.net/uses&quot;&gt;/uses&lt;/a&gt; page that lists these tools and many others I like.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;mise-en-place&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/tools-of-the-trade/#mise-en-place&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;a href=&quot;https://mise.jdx.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;mise-en-place&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Universal dev tool version manager. Specify tool versions in a config file and this tool can ensure that they are installed and active when entering the project directory. Amazing for getting a new dev environment set up in seconds. Replaces &lt;code&gt;asdf&lt;/code&gt;, &lt;code&gt;nvm&lt;/code&gt;, &lt;code&gt;pyenv&lt;/code&gt;, &lt;code&gt;venv&lt;/code&gt;, &lt;code&gt;rbenv&lt;/code&gt;, and many other tool-specific version managers. Supports an incredible number of tools thanks to compatibility with &lt;code&gt;asdf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It also supports installing specific global tools, like &lt;code&gt;angular-cli&lt;/code&gt; from &lt;code&gt;npm&lt;/code&gt;, or &lt;code&gt;stack-pr&lt;/code&gt; from &lt;code&gt;pipx&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;stack-pr&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/tools-of-the-trade/#stack-pr&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/modular/stack-pr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stack-pr&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Open source tool for &lt;a href=&quot;https://www.stacking.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stacking PRs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;PR stacks are, as far as I can tell, the best way to manage large features in git. I first heard about this practice in a series of blog posts from Graphite, a company offering free PR-stacking software and related paid services. But you dont need a custom CI flow or managed service for stacking to work - this CLI tool or one of the others at &lt;a href=&quot;https://www.stacking.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stacking.dev&lt;/a&gt; can take care of this.&lt;/p&gt;
&lt;p&gt;If you start using PR stacks your whole company will start copying you.&lt;/p&gt;
&lt;h3 id=&quot;xc&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/tools-of-the-trade/#xc&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;a href=&quot;https://xcfile.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;xc&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Markdown based task runner.&lt;/p&gt;
&lt;p&gt;Define tasks in code blocks in markdown, and call them from the CLI. Serves as both task definition and documentation.&lt;/p&gt;
&lt;h3 id=&quot;pd2slack&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/tools-of-the-trade/#pd2slack&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/sidpremkumar/pd2slack&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pd2slack&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Simple python script to update the members of a Slack group such as &lt;code&gt;@oncall&lt;/code&gt; to match the active member(s) of a PagerDuty schedule. This replaces several expensive SAAS services.&lt;/p&gt;
&lt;h3 id=&quot;syncthing&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/tools-of-the-trade/#syncthing&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;a href=&quot;https://syncthing.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SyncThing&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;P2P alternative to Dropbox, supports mobile and desktop. Synchronize folders of content across all my devices.&lt;/p&gt;
&lt;h3 id=&quot;obsidian&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/tools-of-the-trade/#obsidian&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;a href=&quot;https://obsidian.md/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Obsidian&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For notes and reference. Sync across devices with &lt;code&gt;syncthing&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;keepassxc&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/tools-of-the-trade/#keepassxc&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; &lt;a href=&quot;https://keepassxc.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;KeePassXC&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For passwords. Sync across devices with &lt;code&gt;syncthing&lt;/code&gt;.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Recipe: Spanish Style Rice</title>
<link href="https://joshua.seigler.net/recipes/spanish-style-rice/" />
<updated>2025-05-05T00:00:00Z</updated>
<id>https://joshua.seigler.net/recipes/spanish-style-rice/</id>
<content type="html">&lt;h2 id=&quot;ingredients&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/spanish-style-rice/#ingredients&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;3 Tbsp neutral oil&lt;/li&gt;
&lt;li&gt;2 cups long grain white rice&lt;/li&gt;
&lt;li&gt;4 cups water&lt;/li&gt;
&lt;li&gt;8 oz tomato sauce&lt;/li&gt;
&lt;li&gt;2 Tbsp chicken or vegetable bouillon powder&lt;/li&gt;
&lt;li&gt;1.5 cups water&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instructions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/spanish-style-rice/#instructions&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Instructions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Add oil to a large frying pan over medium-high heat.&lt;/li&gt;
&lt;li&gt;Add uncooked rice, stirring continually until rice is toasted.&lt;/li&gt;
&lt;li&gt;Stir in 4 cups water, tomato sauce, and bouillon.&lt;/li&gt;
&lt;li&gt;Return to boil and leave uncovered &lt;strong&gt;10 minutes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Stir in 1.5 cups water and return to a boil.&lt;/li&gt;
&lt;li&gt;Reduce heat to low and cover. Simmer &lt;strong&gt;10 minutes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Turn off heat and leave in place, covered for &lt;strong&gt;20 minutes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/spanish-style-rice/#notes&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Notes&lt;/h2&gt;
&lt;p&gt;Original recipe from &lt;a href=&quot;https://www.tiktok.com/t/ZT2Qy1AtF/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;dollartreedinners&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;nutrition-information&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/spanish-style-rice/#nutrition-information&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Nutrition Information&lt;/h2&gt;
&lt;p&gt;Makes 4 servings. Each serving: &lt;strong&gt;Calories&lt;/strong&gt; 441kcal (22%), &lt;strong&gt;Total Fat&lt;/strong&gt; 11.3g (17%), Saturated Fat 1.9g (10%), Trans Fat 0.1g, Cholesterol 1mg (0%), &lt;strong&gt;Sodium&lt;/strong&gt; 56mg (2%), &lt;strong&gt;Total Carbohydrates&lt;/strong&gt; 76g (25%), Dietary Fiber 2g (6%), Sugars 0g, &lt;strong&gt;Protein&lt;/strong&gt; 7g, &lt;strong&gt;Vitamin A&lt;/strong&gt; (1%), &lt;strong&gt;Vitamin C&lt;/strong&gt; (9%), &lt;strong&gt;Calcium&lt;/strong&gt; (7%), &lt;strong&gt;Iron&lt;/strong&gt; (24%)&lt;/p&gt;
</content>
</entry>
<entry>
<title>Recipe: Luther Salad</title>
<link href="https://joshua.seigler.net/recipes/luther-salad/" />
<updated>2025-05-05T00:00:00Z</updated>
<id>https://joshua.seigler.net/recipes/luther-salad/</id>
<content type="html">&lt;h2 id=&quot;ingredients&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/luther-salad/#ingredients&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 lb tri-color rotini&lt;/li&gt;
&lt;li&gt;italian dressing&lt;/li&gt;
&lt;li&gt;extras
&lt;ul&gt;
&lt;li&gt;cubed low-moisture mozzarella&lt;/li&gt;
&lt;li&gt;frozen peas&lt;/li&gt;
&lt;li&gt;shredded chicken&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instructions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/luther-salad/#instructions&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Instructions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Cook rotini in well salted water according to box directions. While rotini cooks, prepare your extras.&lt;/li&gt;
&lt;li&gt;Drain pasta and rinse twice in cold water to remove starch and stop carryover cooking.&lt;/li&gt;
&lt;li&gt;In a large bowl combine rotini and extras. Add italian dressing, at least 8 oz. Mix and serve or refrigerate.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/luther-salad/#notes&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Notes&lt;/h2&gt;
&lt;p&gt;At first we called this “worm salad” but this proved off-putting, and we needed a new name. We had recently learned about the &lt;a href=&quot;https://en.wikipedia.org/wiki/Diet_of_Worms&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;1521 Diet of Worms&lt;/a&gt; where Martin Luther was summoned to defend or recant his beliefs, so we called it “Luther salad” instead.&lt;/p&gt;
&lt;p&gt;The base salad already covers elements of &lt;a href=&quot;https://www.saltfatacidheat.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;salt, fat, acid, and heat&lt;/a&gt;, so your extras are mostly for texture, leaving lots of room for variations:&lt;/p&gt;
&lt;h3 id=&quot;vegan-%2F-healthy%3A&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/luther-salad/#vegan-%2F-healthy%3A&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Vegan / healthy:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;halved cherry tomatoes&lt;/li&gt;
&lt;li&gt;slivered sweet peppers&lt;/li&gt;
&lt;li&gt;paysanne cucumber&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;italian%3A&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/luther-salad/#italian%3A&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Italian:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;halved cherry tomatoes&lt;/li&gt;
&lt;li&gt;sliced black olives, drained&lt;/li&gt;
&lt;li&gt;cubed cheese&lt;/li&gt;
&lt;li&gt;chopped pepperoni&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;nutrition-information&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/luther-salad/#nutrition-information&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Nutrition Information&lt;/h2&gt;
&lt;p&gt;This is less a recipe and more a category of foods. It has a pound of pasta, a good amount of oil, and some protein. So, kinda high on carbs but not the worst thing. No label for this one.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Recipe: Corn Casserole</title>
<link href="https://joshua.seigler.net/recipes/corn-casserole/" />
<updated>2025-04-24T00:00:00Z</updated>
<id>https://joshua.seigler.net/recipes/corn-casserole/</id>
<content type="html">&lt;h2 id=&quot;ingredients&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/corn-casserole/#ingredients&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 can of corn drained&lt;/li&gt;
&lt;li&gt;1 can of creamed corn&lt;/li&gt;
&lt;li&gt;1 stick melted butter 1/2 cup&lt;/li&gt;
&lt;li&gt;1 box of Jiffy Corn Muffin mix&lt;/li&gt;
&lt;li&gt;1 cup sour cream&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instructions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/corn-casserole/#instructions&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Instructions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Preheat the oven to 350 degrees.&lt;/li&gt;
&lt;li&gt;In a bowl, mix all of the ingredients together in order, then pour into a greased 8&amp;quot;x8&amp;quot; baking pan.&lt;/li&gt;
&lt;li&gt;Cook uncovered for 45-50 minutes or until lightly browned.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/corn-casserole/#notes&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Notes&lt;/h2&gt;
&lt;p&gt;Vegan substitutions: almond milk instead of sour cream, vegetable butter or neutral oil instead of butter. Made this way, the result will be less bready but still excellent. Increase cooking time slightly.&lt;/p&gt;
&lt;p&gt;Doubling: if the pan size makes the uncooked mix more than about an inch deep, you will need extra cooking time. Cover it with foil and cook another 20 minutes or so.&lt;/p&gt;
&lt;h2 id=&quot;nutrition-information&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/corn-casserole/#nutrition-information&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Nutrition Information&lt;/h2&gt;
&lt;p&gt;Makes 15.5 100g servings. Each serving: &lt;strong&gt;Calories&lt;/strong&gt;: 167g (8%), &lt;strong&gt;Protein&lt;/strong&gt;: 2.82g (5%), &lt;strong&gt;Total Fat&lt;/strong&gt;: 9.35g (19%), Cholesterol: 31g, Saturated Fat: 5.2g, Trans Fat: 0.24g, &lt;strong&gt;Carbohydrates&lt;/strong&gt;: 20g (8%), Dietary Fiber: 1.1g (4%), Sugars: 2.05g, &lt;strong&gt;Calcium&lt;/strong&gt;: 36mg (4%), &lt;strong&gt;Iron&lt;/strong&gt;: 0.6mg (3%), &lt;strong&gt;Potassium&lt;/strong&gt;: 137mg (3%), &lt;strong&gt;Sodium&lt;/strong&gt;: 346mg (23%)&lt;/p&gt;
</content>
</entry>
<entry>
<title>Post: Thinking machines</title>
<link href="https://joshua.seigler.net/posts/thinking-machines/" />
<updated>2025-04-24T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/thinking-machines/</id>
<content type="html">&lt;p&gt;Theres an exchange early in the classic &#39;80s movie &lt;a href=&quot;https://www.themoviedb.org/movie/97-tron&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TRON&lt;/a&gt;. Some scientists are talking shop:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://joshua.seigler.net/posts/thinking-machines/DYlrbvNwH--128.avif 128w, https://joshua.seigler.net/posts/thinking-machines/DYlrbvNwH--384.avif 384w, https://joshua.seigler.net/posts/thinking-machines/DYlrbvNwH--1152.avif 1152w, https://joshua.seigler.net/posts/thinking-machines/DYlrbvNwH--1280.avif 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://joshua.seigler.net/posts/thinking-machines/DYlrbvNwH--128.jpeg&quot; alt=&quot;Still from TRON, left to right Linda, Alan, and Gibbs, in conversation.&quot; width=&quot;1280&quot; height=&quot;621&quot; srcset=&quot;https://joshua.seigler.net/posts/thinking-machines/DYlrbvNwH--128.jpeg 128w, https://joshua.seigler.net/posts/thinking-machines/DYlrbvNwH--384.jpeg 384w, https://joshua.seigler.net/posts/thinking-machines/DYlrbvNwH--1152.jpeg 1152w, https://joshua.seigler.net/posts/thinking-machines/DYlrbvNwH--1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ALAN:&lt;/strong&gt; I tell ya, ever since he got that Master Control Program, systems got more bugs than a bait store.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GIBBS:&lt;/strong&gt; Ehh, you gotta expect some static. After all, computers are just machines, they cant think…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ALAN:&lt;/strong&gt; Programs will be thinking &lt;em&gt;soon&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GIBBS:&lt;/strong&gt; (wryly) Hahaha, wont that be grand &lt;em&gt;computers and the programs will start thinking, and the people will stop!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gibbs has a point. The modern vision of a utopian future is one where work is relieved, and people are free to pursue leisure, or exercise their creativity with art, writing, and poetry. Thinking computers are here now, in the form of “large language models” (LLMs) like ChatGPT. Setting aside the irony that creative works are the first and most visible applications of LLM technology is that imagined future actually a good one?&lt;/p&gt;
&lt;h2 id=&quot;mom-is-always-right&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/thinking-machines/#mom-is-always-right&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Mom is always right&lt;/h2&gt;
&lt;p&gt;When I was a kid, I remember a day going to yard sales with my mom in the family minivan. It was early summer, a hot day. The windows were down, and I complained that if the vehicle has good air conditioning, we should use it. What was the point in getting all hot? “To get used to the warm weather,” came the answer. What an injustice! We were sweating back there! Later in life, I took a short trip to Arizona in August. Everyone scurried from building to building. Where the sun was doubled, reflected off of glass skyscrapers, the temperature jump was alarming. It was actually unsafe to spend long stretches outside unprepared. But when I returned to Massachusetts, for the rest of the summer 85 or 90 degrees Fahrenheit felt like nothing.&lt;/p&gt;
&lt;p&gt;All that to say, the work that LLM technology offers to relieve isnt just about achieving a result. The effort maintains and builds our abilities. Work pushes us to connect to each other for help, or to persevere in doing something difficult. Outsourcing that work eventually means losing the ability to do it yourself.&lt;/p&gt;
&lt;h2 id=&quot;attention-must-be-paid&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/thinking-machines/#attention-must-be-paid&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Attention must be paid&lt;/h2&gt;
&lt;p&gt;Simply put, an LLM is a document completion engine. You give it text, and it extends it. The result doesnt have to be true, it just has to be convincing. No amount of pre-training or guard rails will make it truthful. It does often say true things, but thats not the point, its more of a happy accident.&lt;/p&gt;
&lt;p&gt;Because they are built from essentially the whole public internet, LLMs also have a strong connection to The Algorithm. Algorithms that run social media feeds and online advertising are designed to attract human attention, a precious thing. Social media algorithms and LLMs are oriented towards capturing that attention. The foundational LLM paper is even called, “Attention is all you need”. A prescient title. LLM intelligence is not like ours. It cant know what its like to be a human.&lt;/p&gt;
&lt;p&gt;If this was a person, someone who wanted your attention and had this kind of indifference towards truth, they would be considered a con-man or bullshitter. &lt;span class=&quot;aside&quot;&gt;&lt;a href=&quot;https://archive.org/details/on-bullshit-by-harry-frankfurt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;On Bullshit&lt;/a&gt;, &lt;em&gt;Harry Frankfurt&lt;/em&gt;&lt;/span&gt; Untrustworthy.&lt;/p&gt;
&lt;h2 id=&quot;don%E2%80%99t-create-the-torment-nexus&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/thinking-machines/#don%E2%80%99t-create-the-torment-nexus&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Dont create the torment nexus&lt;/h2&gt;
&lt;p&gt;LLMs clearly manifest a type of intelligence. Sure, its “just” some linear algebra and a ton of data. But it does exhibit a type of intelligence. One without empathy. &lt;span class=&quot;aside&quot;&gt;&lt;a href=&quot;https://apnews.com/article/chatbot-ai-lawsuit-suicide-teen-artificial-intelligence-9d48adc572100822fdbc3c90d1456bd0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI chatbot pushed teen to kill himself, lawsuit alleges&lt;/a&gt;, &lt;em&gt;AP News&lt;/em&gt;&lt;br&gt;
&lt;a href=&quot;https://www.brusselstimes.com/430098/belgian-man-commits-suicide-following-exchanges-with-chatgpt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Belgian man dies by suicide following exchanges with chatbot&lt;/a&gt;, &lt;em&gt;Brussels Times&lt;/em&gt;&lt;br&gt;
&lt;a href=&quot;https://www.rollingstone.com/culture/culture-features/ai-spiritual-delusions-destroying-human-relationships-1235330175/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI-Fueled Spiritual Delusions Are Destroying Human Relationships&lt;/a&gt;, &lt;em&gt;Rolling Stone&lt;/em&gt;&lt;/span&gt; Not being human, it &lt;em&gt;cant&lt;/em&gt; have empathy—and intelligence without empathy can be dangerous.&lt;/p&gt;
&lt;p&gt;Science fiction is littered with cautionary tales about inhuman intelligence. For that matter, so is myth: genies give people whatever they want, but because people have self-destructive desires (like the desire to avoid work), it goes wrong. In TRON, Infocom has the MCP (Master Control Program), an overgrown chess program that is given access to whatever information it can consume, until its intelligence and capabilities are seemingly endless. The company leadership comes to rely on the program so completely that it becomes their entire interface for understanding and operating the business. There is also the irony that Infocoms success was built on the misuse of intellectual property, much as LLM companies have done &lt;span class=&quot;aside&quot;&gt;&lt;a href=&quot;https://sites.usc.edu/iptls/2025/02/04/ai-copyright-and-the-law-the-ongoing-battle-over-intellectual-property-rights/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI, Copyright, and the Law: The Ongoing Battle Over Intellectual Property Rights &lt;/a&gt;, &lt;em&gt;IP &amp;amp; Technology Law Society&lt;/em&gt;&lt;br&gt;
&lt;a href=&quot;https://hbr.org/2023/04/generative-ai-has-an-intellectual-property-problem&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Generative AI Has an Intellectual Property Problem&lt;/a&gt;, &lt;em&gt;Harvard Business Review&lt;/em&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;I dont think I am wise enough to safely use a genie in a bottle. And I dont want to outsource my creative efforts to an addictive, bullshitting alien intellect, even if it might save time and effort in the short term.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://joshua.seigler.net/posts/thinking-machines/-IYuxB_Iur-128.avif 128w, https://joshua.seigler.net/posts/thinking-machines/-IYuxB_Iur-384.avif 384w, https://joshua.seigler.net/posts/thinking-machines/-IYuxB_Iur-1152.avif 1152w, https://joshua.seigler.net/posts/thinking-machines/-IYuxB_Iur-1280.avif 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://joshua.seigler.net/posts/thinking-machines/-IYuxB_Iur-128.jpeg&quot; alt=&quot;End of line&quot; width=&quot;1280&quot; height=&quot;575&quot; srcset=&quot;https://joshua.seigler.net/posts/thinking-machines/-IYuxB_Iur-128.jpeg 128w, https://joshua.seigler.net/posts/thinking-machines/-IYuxB_Iur-384.jpeg 384w, https://joshua.seigler.net/posts/thinking-machines/-IYuxB_Iur-1152.jpeg 1152w, https://joshua.seigler.net/posts/thinking-machines/-IYuxB_Iur-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
</content>
</entry>
<entry>
<title>Recipe: Sloppy Joes</title>
<link href="https://joshua.seigler.net/recipes/sloppy-joes/" />
<updated>2024-06-07T00:00:00Z</updated>
<id>https://joshua.seigler.net/recipes/sloppy-joes/</id>
<content type="html">&lt;h2 id=&quot;ingredients&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/sloppy-joes/#ingredients&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 lb. hamburger&lt;/li&gt;
&lt;li&gt;1/2 teaspoon paprika&lt;/li&gt;
&lt;li&gt;1 teaspoon chili powder&lt;/li&gt;
&lt;li&gt;1 Tablespoon dry mustard&lt;/li&gt;
&lt;li&gt;1 Tablespoon parsley, chopped&lt;/li&gt;
&lt;li&gt;1 Tablespoon Worcestershire sauce&lt;/li&gt;
&lt;li&gt;2 Tablespoons brown sugar&lt;/li&gt;
&lt;li&gt;2 Tablespoons apple cider vinegar&lt;/li&gt;
&lt;li&gt;1/2 cup onion, diced&lt;/li&gt;
&lt;li&gt;1/2 cup Ketchup&lt;/li&gt;
&lt;li&gt;1 cup water&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instructions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/sloppy-joes/#instructions&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Instructions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Brown beef with onion, draining fat.&lt;/li&gt;
&lt;li&gt;Add all remaining ingredients and bring to a boil.&lt;/li&gt;
&lt;li&gt;Simmer 20 minutes or until thickened, stirring occasionally.&lt;/li&gt;
&lt;li&gt;Refrigerate overnight, serve hot.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/sloppy-joes/#notes&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Notes&lt;/h2&gt;
&lt;p&gt;If you dont have onion you can substitute 1/2 tablespoon onion powder.&lt;br&gt;
Recipe originally from Connie Henderson of Charlottesville, VA&lt;/p&gt;
&lt;h2 id=&quot;nutrition-information&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/recipes/sloppy-joes/#nutrition-information&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Nutrition Information&lt;/h2&gt;
&lt;p&gt;Makes 9.5 100g servings. Each serving: &lt;strong&gt;Calories&lt;/strong&gt;: 135 kcal (6%), &lt;strong&gt;Fat&lt;/strong&gt;: 7.43g (15%), Cholesterol: 32 mg, Saturated Fat: 2.738g, Trans Fat: 0.408g, &lt;strong&gt;Carbohydrates&lt;/strong&gt;: 7.62g (3%), Fiber: 0.4g (2%), Sugars: 5.99g, &lt;strong&gt;Protein&lt;/strong&gt;: 9.26g (17%), &lt;strong&gt;Vitamin C&lt;/strong&gt;: 1.8mg (2%), &lt;strong&gt;Vitamin A&lt;/strong&gt;: 253 IU 1(1%), &lt;strong&gt;Vitamin D&lt;/strong&gt;: 1 IU (0%)&lt;/p&gt;
</content>
</entry>
<entry>
<title>Post: Site design updated</title>
<link href="https://joshua.seigler.net/posts/site-design-updated/" />
<updated>2024-06-05T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/site-design-updated/</id>
<content type="html">&lt;style&gt;@import url(&#39;/fonts/ftaurebesh/ftaurebesh.css&#39;);&lt;/style&gt;
&lt;p&gt;New design! The tools I used before have a lot of unmaintained or outdated dependencies and I wanted something a little simpler. The new site uses &lt;a href=&quot;https://pnpm.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pnpm&lt;/a&gt;, &lt;a href=&quot;https://www.11ty.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;11ty&lt;/a&gt;, and &lt;a href=&quot;https://mozilla.github.io/nunjucks/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Nunjucks&lt;/a&gt;. Content is still in &lt;a href=&quot;https://daringfireball.net/projects/markdown/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;markdown&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One thing Im proud of is a visual ping for footnotes.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://joshua.seigler.net/posts/site-design-updated/#footnote1&quot;&gt;[1]&lt;/a&gt;&lt;a class=&quot;footnote-anchor&quot; id=&quot;footnote-ref1&quot;&gt;&lt;/a&gt;&lt;/sup&gt; When you click a footnote&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://joshua.seigler.net/posts/site-design-updated/#footnote2&quot;&gt;[2]&lt;/a&gt;&lt;a class=&quot;footnote-anchor&quot; id=&quot;footnote-ref2&quot;&gt;&lt;/a&gt;&lt;/sup&gt; it briefly highlights the thing you jumped to.&lt;/p&gt;
&lt;p&gt;In the upper right I added a style toggle that applies the font from Star Wars, “Aurebesh”. I learned how to read it but sometimes want some practice. &lt;span data-language=&quot;aurebesh&quot;&gt;People who can read this are cool and I like them.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I also finally made a section for recipes!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;May 2025 edit: I updated the design some more without changing the tech stack. The main improvements are animated clouds and a host of minor adjustments.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;June 2025 edit: I have continued to alter the design. Pray I dont alter it any further.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;footnote1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;It highlights when you click back, too. &lt;a href=&quot;https://joshua.seigler.net/posts/site-design-updated/#footnote-ref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Hi. &lt;a href=&quot;https://joshua.seigler.net/posts/site-design-updated/#footnote-ref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>
</entry>
<entry>
<title>Post: Finally, a Coherent Worldview</title>
<link href="https://joshua.seigler.net/posts/finally-a-coherent-worldview/" />
<updated>2023-07-14T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/finally-a-coherent-worldview/</id>
<content type="html">&lt;p&gt;Around the time of my previous post, I had just been received into the Orthodox church. Since then I have found it to be everything I was looking for, and a great deal more. There is such a wealth of wisdom, going back thousands of years. And it was all there, un-seen, un-read, as far as I was concerned not existing at all! It seems impossible to me that I was so unaware of these treasures by chance.&lt;/p&gt;
&lt;p&gt;Father Seraphim Rose, Saint Paisios, Saint Porphyrios, Elder Thaddeus of Vitovnica - to name only a few! - lived in this world, recently. They speak plainly and lovingly about modern and familiar concerns. Their example and guidance are a priceless treasure! And not only they help me, but participating in the tradition of the Orthodox Church has… I dont even know how to say it all. I have experienced how the prodigal son felt when he took a few trembling steps back to his father, and instead of the rejection or anger he had earned, he received joyful, unearned forgiveness. His father &lt;em&gt;ran&lt;/em&gt; to him while he was still far away!&lt;/p&gt;
&lt;p&gt;Here is what I know, now from experience: Jesus Christ is life and truth and love. To look for life, or truth, or love apart from Him is pointless! Its a contradiction, like looking for light by marching into the shadows. God made me, and He loves me more than I love myself. Because this is true, I want to do everything His way, even if I dont understand it at first.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Post: Embracing Mysticism</title>
<link href="https://joshua.seigler.net/posts/embracing-mysticism/" />
<updated>2021-10-16T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/embracing-mysticism/</id>
<content type="html">&lt;p&gt;Logical arguments no longer work. This has been especially visible in the pandemic response in 2020. If you dug even a little below the surface of any mainstream narrative in the past two years, you likely found points of disagreement. But showing people scientific papers, charts, statistical analysis, or other types of evidence accomplishes nothing, or worse it invites accusations of being part of the Other Team, one of those backwards, wrong, stupid people.&lt;/p&gt;
&lt;p&gt;In mid-2020 Vin Armani (now Cyprian) started calling this change “The Dim Age”&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://joshua.seigler.net/posts/embracing-mysticism/#footnote1&quot;&gt;[1]&lt;/a&gt;&lt;a class=&quot;footnote-anchor&quot; id=&quot;footnote-ref1&quot;&gt;&lt;/a&gt;&lt;/sup&gt;. He suggested that most people still see the world as exclusively physical, oblivious to patterns of reality that are plainly obvious to more mystically aware people.&lt;/p&gt;
&lt;p&gt;In an attempt to remedy my newfound illiteracy, I started exploring symbolism, which as I understood it dealt with identifying and understanding meaning. I found Jonathan Pageaus project &lt;a href=&quot;https://thesymbolicworld.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Symbolic World&lt;/a&gt;, which has some very accessible videos breaking down movies and other pop culture artifacts from a symbolic perspective &lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://joshua.seigler.net/posts/embracing-mysticism/#footnote2&quot;&gt;[2]&lt;/a&gt;&lt;a class=&quot;footnote-anchor&quot; id=&quot;footnote-ref2&quot;&gt;&lt;/a&gt;&lt;/sup&gt;. These commentaries did not seem arbitrary or speculative, but pointed to cultural trends that I couldnt un-see once I understood them. I binged a bunch more of his material, including eventually a book his brother Mattheiu wrote, &lt;em&gt;The Language of Creation: Cosmic Symbolism in Genesis&lt;/em&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://joshua.seigler.net/posts/embracing-mysticism/#footnote3&quot;&gt;[3]&lt;/a&gt;&lt;a class=&quot;footnote-anchor&quot; id=&quot;footnote-ref3&quot;&gt;&lt;/a&gt;&lt;/sup&gt;. Through this I discovered a side of reality I had been almost completely oblivious to, and whats more, an aspect of my faith which had somehow completely passed me by.&lt;/p&gt;
&lt;p&gt;From there I started listening to the &lt;a href=&quot;https://www.ancientfaith.com/podcasts/lordofspirits&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Lord of Spirits&lt;/a&gt; podcast. I learned that commonplace, obvious understanding of existence as material &lt;em&gt;and spiritual&lt;/em&gt; has been mostly lost, displaced by modern confidence that the material world is the limit of reality, over which sovereign mankind rules. The ancient faith of Christianity, known now as “Eastern Orthodoxy”, corresponds with reality, especially spiritual patterns of reality as we see more plainly every week, better than anything else I know.&lt;/p&gt;
&lt;p&gt;For a while I think my highest values have been freedom and truth. A desire to be solely responsible for myself, and a desire to understand myself and the world fully and accurately. But I didnt realize that my chief obstacle is hardly megacorps and governments: I am ruled by my own out-of-control desires: for comfort, pleasure, control, satisfaction, even self-mastery. In a paradise where my every whim was manifested, I would still be a slave to desire, consuming and &lt;em&gt;wanting&lt;/em&gt; more and more.&lt;/p&gt;
&lt;p&gt;Investigating eastern orthodoxy, this ancient Christianity, revealed a better path to freedom and truth: aiming higher. Every action and choice is in service to something. Instead of serving little tyrannical gods like comfort or pleasure, or potentially nobler gods like a country or even a “liberty movement”, I will attempt to serve the Most High.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;footnote1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://freemanbeyondthewall.libsyn.com/episode-478&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Free Man Beyond The Wall episode 478: Weve Entered The Dim Age&lt;/a&gt; &lt;a href=&quot;https://joshua.seigler.net/posts/embracing-mysticism/#footnote-ref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://thesymbolicworld.com/videos/symbolism-propaganda-in-popular-culture/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Symbolism and Propaganda in Popular Culture&lt;/a&gt;, &lt;a href=&quot;https://thesymbolicworld.com/videos/the-fall-of-loki-into-the-multiverse/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Fall of Loki (Into the Multiverse)&lt;/a&gt; &lt;a href=&quot;https://joshua.seigler.net/posts/embracing-mysticism/#footnote-ref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://amzn.to/4iBOExr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Language of Creation: Cosmic Symbolism in Genesis: A Commentary&lt;/a&gt;, ISBN 978-1981549337 &lt;a href=&quot;https://joshua.seigler.net/posts/embracing-mysticism/#footnote-ref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>
</entry>
<entry>
<title>Post: Needs-based communication</title>
<link href="https://joshua.seigler.net/posts/needs-based-communication/" />
<updated>2021-05-26T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/needs-based-communication/</id>
<content type="html">&lt;p&gt;Needs-based communication (usually called non-violent communication or NVC™) is a way of understanding yourself and others with a unique insight: everyone has their own personal reactions to the world, but people have the same basic needs. We recognize those needs in other people, and that common connection can allow us to communicate clearly when there is conflict.&lt;/p&gt;
&lt;h2 id=&quot;needs&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/needs-based-communication/#needs&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Needs&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Needs&lt;/strong&gt; are universal to humanity. They are common drives that we all experience, and this universality makes them perfect for connecting with each other. Some broad categories of needs are the needs for: connection, physical well-being, honesty, play, peace, autonomy, and meaning. Needs can also be specific: a need for clarity, nurturing, integrity, trust, space, etc. Needs are abstract, not connected to people or actions. For example, peace is a need, muting TV commercials is not. Here is an abbreviated list of needs from the Center for Non-Violent Communication (CNVC):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Physical wellbeing&lt;/strong&gt; - air, food, movement/exercise, rest/sleep, sexual expression, safety, shelter, touch, water&lt;br&gt;
&lt;strong&gt;Honesty&lt;/strong&gt; - authenticity, integrity, presence&lt;br&gt;
&lt;strong&gt;Connection&lt;/strong&gt; - acceptance, affection, appreciation, belonging, cooperation, communication, closeness, community, companionship, compassion, consideration, consistency, empathy, inclusion, intimacy, love, mutuality, nurturing, respect/self-respect, safety, security, stability, support, to know and be known, to see and be seen, to understand and be understood, trust, warmth&lt;br&gt;
&lt;strong&gt;Play&lt;/strong&gt; - joy, humor&lt;br&gt;
&lt;strong&gt;Peace&lt;/strong&gt; - beauty, communion, ease, equality, harmony, inspiration, order&lt;br&gt;
&lt;strong&gt;Autonomy&lt;/strong&gt; - choice, freedom, independence, space, spontaneity&lt;br&gt;
&lt;strong&gt;Meaning&lt;/strong&gt; - awareness, celebration of, life challenge, clarity, competence, consciousness, contribution, creativity, discovery, efficacy, effectiveness, growth, hope, learning, mourning, participation, purpose, self-expression, stimulation, to matter, understanding&lt;/p&gt;
&lt;p&gt;Everything &lt;em&gt;anyone&lt;/em&gt; does is an attempt to meet a need. None of these universal needs is wrong or inherently harmful, although sometimes the strategies we use can be.&lt;/p&gt;
&lt;h2 id=&quot;conflict&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/needs-based-communication/#conflict&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Conflict&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Conflict&lt;/strong&gt; happens when several peoples needs arent met. We get stuck in conflict when we mix up needs and strategies. Needs never conflict with each other, only strategies do.&lt;/p&gt;
&lt;p&gt;When we experience conflict or negative feelings, that indicates that there is an unmet need. In an attempt to end a conflict, we often settle on unsatisfying resolutions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We suppress the need and move on, painfully leaving the problem unaddressed.&lt;/li&gt;
&lt;li&gt;We come to an uneasy agreement about who is the winner and who is the loser, and the loser gives up on meeting their need. The immediate conflict is over, but the problem is not really resolved.&lt;/li&gt;
&lt;li&gt;We escalate, expanding the conflict in an attempt to win, at the others expense if necessary.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These resolutions can happen despite our best intentions, as a result of not understanding whats happening as we fight. A very common mistake is to confuse needs and strategies.&lt;/p&gt;
&lt;h2 id=&quot;strategies&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/needs-based-communication/#strategies&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Strategies&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Strategies&lt;/strong&gt; are things we do to meet our needs. In contrast to needs, which are abstract and universal, strategies are personal, specific, and widely varied.&lt;/p&gt;
&lt;p&gt;For example, consider the need for self-expression. There are as many strategies as there are people and situations: singing, writing, talking, composing, dressing a certain way… and on and on.&lt;/p&gt;
&lt;p&gt;Jumping into a conflict strategy-first is bound to cause problems if that strategy doesnt meet others needs as well as your own. The way past conflict is for everyone involved to understand each others needs, and &lt;em&gt;then&lt;/em&gt; work together to find a strategy to meet those needs.&lt;/p&gt;
&lt;p&gt;So, &lt;strong&gt;how do you figure out your own needs?&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;feelings&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/needs-based-communication/#feelings&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Feelings&lt;/h2&gt;
&lt;p&gt;Negative feelings are a sign that you have an unmet need. Unfortunately, most of us have learned to bundle in certain judgments and name them as feelings. For example, I might think I am feeling &lt;em&gt;abandoned&lt;/em&gt;, but really this is a feeling of disconnectedness, vulnerability, loneliness, or something else, combined with a judgment that someone else has made me feel that way.&lt;/p&gt;
&lt;p&gt;The truth is that the same situation can affect different people in very different ways. This means that feelings must come from a persons own response to things. In order to see your own feelings clearly, it is important to take ownership of them as &lt;em&gt;your&lt;/em&gt; feelings rather than something caused by the world around you. I have found this to be very challenging, but also incredibly rewarding.&lt;/p&gt;
&lt;p&gt;CNVC provides an incomplete inventory of feelings:&lt;/p&gt;
&lt;h3 id=&quot;feelings-when-needs-are-met&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/needs-based-communication/#feelings-when-needs-are-met&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Feelings when needs are met&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Affectionate&lt;/strong&gt; - compassionate, friendly, loving, open-hearted, sympathetic, tender, warm&lt;br&gt;
&lt;strong&gt;Engaged&lt;/strong&gt; - absorbed, alert, curious, engrossed, enchanted, entranced, fascinated, interested, intrigued, involved, spellbound, stimulated&lt;br&gt;
&lt;strong&gt;Hopeful&lt;/strong&gt; - expectant, encouraged, optimistic&lt;br&gt;
&lt;strong&gt;Confident&lt;/strong&gt; - empowered, open, proud, safe, secure&lt;br&gt;
&lt;strong&gt;Excited&lt;/strong&gt; - amazed, animated, ardent, aroused, astonished, dazzled, eager, energetic, enthusiastic, giddy, invigorated, lively, passionate, surprised, vibrant&lt;br&gt;
&lt;strong&gt;Grateful&lt;/strong&gt; - appreciative, moved, thankful, touched&lt;br&gt;
&lt;strong&gt;Inspired&lt;/strong&gt; - amazed, awed, wonder&lt;br&gt;
&lt;strong&gt;Refreshed&lt;/strong&gt; - enlivened, rejuvenated, renewed, rested, restored, revived&lt;/p&gt;
&lt;h3 id=&quot;feelings-when-needs-are-not-met&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/needs-based-communication/#feelings-when-needs-are-not-met&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Feelings when needs are not met&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Afraid&lt;/strong&gt; - apprehensive, dread, foreboding, frightened, mistrustful, panicked, petrified, scared, suspicious, terrified, wary, worried&lt;br&gt;
&lt;strong&gt;Annoyed&lt;/strong&gt; - aggravated, dismayed, disgruntled, displeased, exasperated, frustrated, impatient, irritated, irked&lt;br&gt;
&lt;strong&gt;Angry&lt;/strong&gt; - enraged, furious, incensed, indignant, irate, livid, outraged, resentful&lt;br&gt;
&lt;strong&gt;Aversion&lt;/strong&gt; - animosity, appalled, contempt, disgusted, dislike, hate, horrified, hostile, repulsed&lt;br&gt;
&lt;strong&gt;Confused&lt;/strong&gt; - ambivalent, baffled, bewildered, dazed, hesitant, lost, mystified, perplexed, puzzled, torn&lt;br&gt;
&lt;strong&gt;Disconnected&lt;/strong&gt; - alienated, aloof, apathetic, bored, cold, detached, distant, distracted, indifferent, numb, removed, uninterested, withdrawn&lt;br&gt;
&lt;strong&gt;Disquiet&lt;/strong&gt; - agitated, alarmed, discombobulated, disconcerted, disturbed, perturbed, rattled, restless, shocked, startled, surprised, troubled, turbulent, turmoil, uncomfortable, uneasy, unnerved, unsettled, upset&lt;br&gt;
&lt;strong&gt;Embarrassed&lt;/strong&gt; - ashamed, chagrined, flustered, guilty, mortified, self-conscious&lt;br&gt;
&lt;strong&gt;Fatigue&lt;/strong&gt; - beat, burnt out, depleted, exhausted, lethargic, listless, sleepy, tired, weary, worn out&lt;br&gt;
&lt;strong&gt;Pain&lt;/strong&gt; - agony, anguished, bereaved, devastated, grief, heartbroken, hurt, lonely, miserable, regretful, remorseful&lt;br&gt;
&lt;strong&gt;Sad&lt;/strong&gt; - depressed, dejected, despair, despondent, disappointed, discouraged, disheartened, forlorn, gloomy, heavy-hearted, hopeless, melancholy, unhappy, wretched&lt;br&gt;
&lt;strong&gt;Tense&lt;/strong&gt; - anxious, cranky, distressed, distraught, edgy, fidgety, frazzled, irritable, jittery nervous, overwhelmed, restless, stressed out&lt;br&gt;
&lt;strong&gt;Vulnerable&lt;/strong&gt; - fragile, guarded, helpless, insecure, leery, reserved, sensitive, shaky&lt;br&gt;
&lt;strong&gt;Yearning&lt;/strong&gt; - envious, jealous, longing, nostalgic, pining, wistful&lt;/p&gt;
&lt;h2 id=&quot;resolving-feelings-from-unmet-needs&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/needs-based-communication/#resolving-feelings-from-unmet-needs&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Resolving feelings from unmet needs&lt;/h2&gt;
&lt;p&gt;Once you have an honest name for what you are feeling, think about what need sparked the feeling.&lt;/p&gt;
&lt;p&gt;There is a (kind of clunky) formula for requesting help meeting a need without tacking on strategies, demands, judgments, or other baggage. As the exercise becomes more habitual, you wont need the formula, and can accomplish the same thing more naturally.&lt;/p&gt;
&lt;p&gt;Here it is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When &lt;em&gt;[observation]&lt;/em&gt;, I felt &lt;em&gt;[feeling]&lt;/em&gt; because I was having a need for &lt;em&gt;[need]&lt;/em&gt;. (possibly also a request:) Are you willing to &lt;em&gt;[action]&lt;/em&gt;?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the spirit of communicating without judgments, the observation should be strictly focused on facts, with no mind-reading or attribution at all. Sharing your feelings in addition to the need can help the other person recognize the need and how it affects you. If the other person understands the need, you can also make a request for some specific action to help meet your need.&lt;/p&gt;
&lt;p&gt;It is very important that the action you request be feasible, concrete, and specific. Asking someone to change their behavior forever, think a certain way, etc is too much. The request should also really, truly be a request and not a demand. A “No!” should be as welcome as a “Yes!” because the goal is to find a strategy that meets your needs &lt;em&gt;and&lt;/em&gt; theirs.&lt;/p&gt;
&lt;p&gt;There is a (similarly clunky) pattern for discovering someone elses needs. As you listen to them, you will probably get an idea for how they feel, and you may be able to guess what need they are experiencing. You can ask:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you &lt;em&gt;[observation]&lt;/em&gt; do you feel &lt;em&gt;[feeling]&lt;/em&gt; because you are having a need for &lt;em&gt;[need]&lt;/em&gt;? (possibly also:) Right now, would you like me to &lt;em&gt;[action]&lt;/em&gt;?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Like the other formula, this is just a beginning point, almost too rough to use except for training your responses and replacing old communication habits.&lt;/p&gt;
&lt;p&gt;These are two sides of the same coin, a pattern that draws a line from the stimulus, some observation, through the needs, towards a solution. Even if you guess wrong, just focusing on someones feelings and needs demonstrates that you are really interested in their problem.&lt;/p&gt;
&lt;p&gt;Even without explicitly using this pattern (observation ➔ feeling ➔ need ➔ request), just by thinking about needs (your own and others) you can untangle conflict and see other people with much more empathy. Maybe that reckless driver is having a need for excitement and power, and zipping around you was the best strategy they could come up with. Just seeing past the image of others as enemies or obstacles can make the world much less hostile, by revealing them to be real humans, people you might be able to connect with. This way of thinking can also be a path to growth as you take ownership of your feelings and see your needs clearly.&lt;/p&gt;
&lt;p&gt;Some resources for exploring these ideas more:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.therightword.info/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Right Words and Beyond&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amzn.to/44cpIsV&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Nonviolent Communication: A Language of Life&lt;/a&gt;, ISBN 189200528X&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cnvc.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Center for Nonviolent Communication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
<entry>
<title>Post: The Trivium: A Tool for Learning Anything</title>
<link href="https://joshua.seigler.net/posts/the-trivium-a-tool-for-learning-anything/" />
<updated>2021-04-03T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/the-trivium-a-tool-for-learning-anything/</id>
<content type="html">&lt;p&gt;Information today has become siloed. Its a common belief that little, if any, expertise from one field of knowledge transfers over to other fields. But there is a forgotten tool that anyone can use to confidently approach new subjects and problems: the &lt;em&gt;Trivium&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The ancients considered the liberal arts to be composed of seven parts. First was a foundation called the &lt;em&gt;trivium&lt;/em&gt;, composed of grammar, logic, and rhetoric. Following that was the &lt;em&gt;quadrivium&lt;/em&gt;, which was arithmetic, geometry, music, and astronomy (numbers, numbers in space, numbers in time, numbers in time and space). The trivium (literally, “three ways”), is a framework for learning.&lt;/p&gt;
&lt;h2 id=&quot;grammar&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/the-trivium-a-tool-for-learning-anything/#grammar&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Grammar&lt;/h2&gt;
&lt;p&gt;Grammar is about gaining knowledge: collecting information, without judgment or analysis. It answers the questions “Who, what, where, and when?” This is possibly the most important step, since (depending on what you study) essential information may not be readily available.&lt;/p&gt;
&lt;h2 id=&quot;logic&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/the-trivium-a-tool-for-learning-anything/#logic&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Logic&lt;/h2&gt;
&lt;p&gt;Logic is about gaining understanding. It answers “why?” This is the foundation for relating to the world. It has three components: filtration, correlation, and analysis. It places the information gathered into context, and eliminates inconsistency and resolves conflicting perspectives.&lt;/p&gt;
&lt;h2 id=&quot;rhetoric&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/the-trivium-a-tool-for-learning-anything/#rhetoric&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Rhetoric&lt;/h2&gt;
&lt;p&gt;Rhetoric is about acting wisely: the application of knowledge and understanding, put into correct action. It answers “how?”&lt;/p&gt;
&lt;p&gt;Methodically applying this method provides a clear next step when encountering any unfamiliar topic. This is a powerful tool for methodically determining the best way to achieve your goals.&lt;/p&gt;
&lt;h2 id=&quot;resources&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/the-trivium-a-tool-for-learning-anything/#resources&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://triviumbinder.blogspot.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Trivium Binder Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.scribd.com/doc/59477946/Trivium-Method-of-Critical-Thinking-and-Creative-Problem-Solving&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tragedy and Hope: Five page summary of the Trivium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.scribd.com/document/33744483/Trivium-Method-of-Thinking-vs-Other-Methodologies&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Shadows of the trivium in narrow disciplines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
<entry>
<title>Post: Authority - Consent&#39;s Blind Spot</title>
<link href="https://joshua.seigler.net/posts/authority-consents-blind-spot/" />
<updated>2020-07-02T00:00:00Z</updated>
<id>https://joshua.seigler.net/posts/authority-consents-blind-spot/</id>
<content type="html">&lt;blockquote&gt;
&lt;p&gt;2025 disclaimer: I havent thought through all these ideas in a while, but I probably would change some of this or soften/rephrase it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Consent occurs when an individual voluntarily agrees to the proposal or desires of another. It comes from the concept that who should decide what happens to your person, is you.&lt;/p&gt;
&lt;p&gt;There are two ways people interact: with consent, and without it. Some people care a lot about consent, but overall, most take whichever route is easiest, or more convenient.&lt;/p&gt;
&lt;p&gt;People respect consent in most of their face-to-face dealings with others. Violating someones consent in person is usually met with resistance, possibly very strong resistance with a long-lasting impact. But there are covert ways to violate consent, so that the target must not notice the violation—or if they do notice, they must be unable to determine who is to blame.&lt;/p&gt;
&lt;p&gt;Pretty much everyone has had circumstances where they did something because another person, or group of people, compelled their compliance. Classic examples include paying taxes, being drafted, and avoiding certain activities, beliefs, or substances.&lt;/p&gt;
&lt;p&gt;Here are some popular excuses for violating consent that you may have seen:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am actually helping you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;You like some of the things I do, so you must accept this as well.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Everyone else lets me do this.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Everyone else said it was okay if I do this.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I am doing this, but someone else is responsible for my actions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;You agreed to this by being born here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I am allowed to do this.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That last one combines all the others into one argument, called authority. This is the idea that certain people are justified in violating consent. Usually there is a vaguely religious ceremony associated with the granting of authority—something like a holy document, large gatherings of people, formal outfits, or important sounding titles.&lt;/p&gt;
&lt;p&gt;Sometimes consensual relationships are described as involving authority, such as a boss at work having “authority” over an employee—but the difference is clear: if the boss says to do something but the employee no longer consents, they could exit that relationship.&lt;br&gt;
Sometimes people refer to an expert as an “authority” on a certain matter, but this definition is also not of use here. I refer to authority here as the ability to act upon anothers person, without regard for consent.&lt;/p&gt;
&lt;p&gt;One problem with authority is that all the people on earth are humans. Theres nobody better than humans who would obviously deserve special treatment, nor is there some obviously superior category of human, so people expect some excuse for how an ordinary person obtains authority.&lt;/p&gt;
&lt;p&gt;In certain belief systems, the excuse was “God chose me and made me worthy.” Contemporarily, the claim is based on “the will of the people”. Whoever wins a special regional popularity competition is considered to have authority over everyone in that region, even people who disagree.&lt;/p&gt;
&lt;p&gt;You would think acting on someone in a way they dont allow is difficult, but people are impressed by ceremonies of authority, and they are confused by the way everyone involved claims that their actions are someone elses responsibility. Even if people manage to see through the tricks they are usually still afraid to resist authority out of a belief that nobody will help them. So almost everyone obeys.&lt;/p&gt;
&lt;h2 id=&quot;solutions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/authority-consents-blind-spot/#solutions&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Solutions&lt;/h2&gt;
&lt;p&gt;Once you have seen through this trick, what can you do?&lt;/p&gt;
&lt;h3 id=&quot;look-for-ways-to-sidestep-authority-altogether.&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/authority-consents-blind-spot/#look-for-ways-to-sidestep-authority-altogether.&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Look for ways to sidestep authority altogether.&lt;/h3&gt;
&lt;p&gt;Since very few people accept &lt;em&gt;absolute&lt;/em&gt; authority, there are all kinds of limitations to its scope. If you can find ways to move your activities to areas of life that are not “covered” by authority, you will be able to ignore it more.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://theconsciousresistance.com/wp-content/uploads/2020/01/How_to_Opt_Out_of_the_Technocratic_State.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;How to Opt Out of the Technocratic State (PDF)&lt;/a&gt; by Derrick Broze&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.kopubco.com/pdf/An_Agorist_Primer_by_SEK3.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;An Agorist Primer (PDF)&lt;/a&gt; by Samuel Edward Konkin III&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.seasteading.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Seasteading Institute&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;teach-other-people-how-to-see-these-tricks-more-clearly.&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/authority-consents-blind-spot/#teach-other-people-how-to-see-these-tricks-more-clearly.&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Teach other people how to see these tricks more clearly.&lt;/h3&gt;
&lt;p&gt;Relatively few people claim to have authority. If even a moderate fraction of people resist authoritarian demands, it becomes impossible to compel them all by force.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL4jzSARXHuuwhBfzGNYhSVE4gJ8zmRnTH&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Playlist: Thomasz Kaye Animations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fee.org/stories&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Foundation for Economic Education&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;promote-alternatives-that-respect-consent.&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/authority-consents-blind-spot/#promote-alternatives-that-respect-consent.&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Promote alternatives that respect consent.&lt;/h3&gt;
&lt;p&gt;For every authority-based solution to a problem, there is a more effective consensual solution, and usually the consensual way of doing things is already being used somewhere, and has lower costs and better outcomes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://daviddfriedman.com/The_Machinery_of_Freedom_.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Machinery of Freedom (PDF)&lt;/a&gt; &lt;a href=&quot;http://daviddfriedman.com/The_Machinery_of_Freedom.prc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(Ebook)&lt;/a&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=jTYkdEU_B4o&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(Video)&lt;/a&gt; by David D Friedman&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;use-the-ceremonies-of-authority-against-itself.&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/authority-consents-blind-spot/#use-the-ceremonies-of-authority-against-itself.&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Use the ceremonies of authority against itself.&lt;/h3&gt;
&lt;p&gt;If someone with authority asks your opinion on some topic, steer them away from choices that violate consent. It may even be appropriate to support people who seek positions of authority if you believe they will prevent it from being used, but dont be surprised if their encounter with power changes their values.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://lp.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Libertarian Party&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;surround-yourself-with-people-who-care-about-consent.&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/authority-consents-blind-spot/#surround-yourself-with-people-who-care-about-consent.&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Surround yourself with people who care about consent.&lt;/h3&gt;
&lt;p&gt;If you know the people around you care about consent, then when someone claiming authority makes demands of the community, it will be much safer to ignore the demands since you would not be alone.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.fsp.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Free State Project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;additional-resources&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://joshua.seigler.net/posts/authority-consents-blind-spot/#additional-resources&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt; Additional Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://spot.colorado.edu/~huemer/1.htm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Problem of Political Authority (Chapter 1)&lt;/a&gt; &lt;a href=&quot;https://amzn.to/2AyQxw0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(Amazon)&lt;/a&gt; by Michael Huemer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ia601208.us.archive.org/27/items/236222899TheMostDangerousSuperstitionLarkenRose2011/the-most-dangerous-superstition-larken-rose-20111.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Most Dangerous Superstitition (PDF)&lt;/a&gt; by Larken Rose&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bastiat.org/en/the_law.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Law&lt;/a&gt; by Frédéric Bastiat&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
</feed>

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

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