diff --git a/-IYuxB_Iur-1152-wb3dEoW4.jpeg b/-IYuxB_Iur-1152-wb3dEoW4.jpeg
new file mode 100644
index 0000000..9ff9ceb
Binary files /dev/null and b/-IYuxB_Iur-1152-wb3dEoW4.jpeg differ
diff --git a/-IYuxB_Iur-1280-cgTSeSNs.jpeg b/-IYuxB_Iur-1280-cgTSeSNs.jpeg
new file mode 100644
index 0000000..1df9626
Binary files /dev/null and b/-IYuxB_Iur-1280-cgTSeSNs.jpeg differ
diff --git a/.gitignore b/.gitignore
index 4c9feb0..51e0a7d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,3 @@
dist
node_modules
.plugin-clean
-.cache
-.11ty-vite
diff --git a/31JQodtCZd-128-B7DUbFN5.jpeg b/31JQodtCZd-128-B7DUbFN5.jpeg
new file mode 100644
index 0000000..b34f4b3
Binary files /dev/null and b/31JQodtCZd-128-B7DUbFN5.jpeg differ
diff --git a/31JQodtCZd-263-B9kfNm_J.avif b/31JQodtCZd-263-B9kfNm_J.avif
new file mode 100644
index 0000000..eb026a4
Binary files /dev/null and b/31JQodtCZd-263-B9kfNm_J.avif differ
diff --git a/31JQodtCZd-263-HxN8CM5g.jpeg b/31JQodtCZd-263-HxN8CM5g.jpeg
new file mode 100644
index 0000000..ba809fa
Binary files /dev/null and b/31JQodtCZd-263-HxN8CM5g.jpeg differ
diff --git a/4FEYDkJPXb-128-CHFUdODc.jpeg b/4FEYDkJPXb-128-CHFUdODc.jpeg
new file mode 100644
index 0000000..dac88a6
Binary files /dev/null and b/4FEYDkJPXb-128-CHFUdODc.jpeg differ
diff --git a/4FEYDkJPXb-128-CTtHsZRd.avif b/4FEYDkJPXb-128-CTtHsZRd.avif
new file mode 100644
index 0000000..c179889
Binary files /dev/null and b/4FEYDkJPXb-128-CTtHsZRd.avif differ
diff --git a/4FEYDkJPXb-306-BvPZTm4x.avif b/4FEYDkJPXb-306-BvPZTm4x.avif
new file mode 100644
index 0000000..07753bc
Binary files /dev/null and b/4FEYDkJPXb-306-BvPZTm4x.avif differ
diff --git a/4FEYDkJPXb-306-mG1HfCAy.jpeg b/4FEYDkJPXb-306-mG1HfCAy.jpeg
new file mode 100644
index 0000000..e6c0995
Binary files /dev/null and b/4FEYDkJPXb-306-mG1HfCAy.jpeg differ
diff --git a/CiefJuzBPy-128-BiFuRkEh.jpeg b/CiefJuzBPy-128-BiFuRkEh.jpeg
new file mode 100644
index 0000000..0aaee62
Binary files /dev/null and b/CiefJuzBPy-128-BiFuRkEh.jpeg differ
diff --git a/CiefJuzBPy-258-BH0FB1hO.avif b/CiefJuzBPy-258-BH0FB1hO.avif
new file mode 100644
index 0000000..cda5d32
Binary files /dev/null and b/CiefJuzBPy-258-BH0FB1hO.avif differ
diff --git a/CiefJuzBPy-258-DUfUtPiz.jpeg b/CiefJuzBPy-258-DUfUtPiz.jpeg
new file mode 100644
index 0000000..8662744
Binary files /dev/null and b/CiefJuzBPy-258-DUfUtPiz.jpeg differ
diff --git a/DYlrbvNwH--1152-CFoGP2ol.avif b/DYlrbvNwH--1152-CFoGP2ol.avif
new file mode 100644
index 0000000..bca286f
Binary files /dev/null and b/DYlrbvNwH--1152-CFoGP2ol.avif differ
diff --git a/DYlrbvNwH--1152-ngK3SfkN.jpeg b/DYlrbvNwH--1152-ngK3SfkN.jpeg
new file mode 100644
index 0000000..50d689c
Binary files /dev/null and b/DYlrbvNwH--1152-ngK3SfkN.jpeg differ
diff --git a/DYlrbvNwH--1280-7fOlr9wV.avif b/DYlrbvNwH--1280-7fOlr9wV.avif
new file mode 100644
index 0000000..e4a1e17
Binary files /dev/null and b/DYlrbvNwH--1280-7fOlr9wV.avif differ
diff --git a/DYlrbvNwH--1280-DN7XhumV.jpeg b/DYlrbvNwH--1280-DN7XhumV.jpeg
new file mode 100644
index 0000000..76b59c1
Binary files /dev/null and b/DYlrbvNwH--1280-DN7XhumV.jpeg differ
diff --git a/DYlrbvNwH--384-BXjTSUwJ.avif b/DYlrbvNwH--384-BXjTSUwJ.avif
new file mode 100644
index 0000000..3eea760
Binary files /dev/null and b/DYlrbvNwH--384-BXjTSUwJ.avif differ
diff --git a/DYlrbvNwH--384-DIgEa-dN.jpeg b/DYlrbvNwH--384-DIgEa-dN.jpeg
new file mode 100644
index 0000000..b20216a
Binary files /dev/null and b/DYlrbvNwH--384-DIgEa-dN.jpeg differ
diff --git a/K3T_iHask9-128-BpMLJT5N.jpeg b/K3T_iHask9-128-BpMLJT5N.jpeg
new file mode 100644
index 0000000..d7a833a
Binary files /dev/null and b/K3T_iHask9-128-BpMLJT5N.jpeg differ
diff --git a/K3T_iHask9-128-QoHBjVQp.avif b/K3T_iHask9-128-QoHBjVQp.avif
new file mode 100644
index 0000000..5138a4e
Binary files /dev/null and b/K3T_iHask9-128-QoHBjVQp.avif differ
diff --git a/K3T_iHask9-267-B2WMLbag.jpeg b/K3T_iHask9-267-B2WMLbag.jpeg
new file mode 100644
index 0000000..c35f080
Binary files /dev/null and b/K3T_iHask9-267-B2WMLbag.jpeg differ
diff --git a/K3T_iHask9-267-B6jWopeS.avif b/K3T_iHask9-267-B6jWopeS.avif
new file mode 100644
index 0000000..45b1250
Binary files /dev/null and b/K3T_iHask9-267-B6jWopeS.avif differ
diff --git a/PR5MkoxXPW-128-CqBOAmRm.avif b/PR5MkoxXPW-128-CqBOAmRm.avif
new file mode 100644
index 0000000..94e0766
Binary files /dev/null and b/PR5MkoxXPW-128-CqBOAmRm.avif differ
diff --git a/PR5MkoxXPW-128-DSxREojv.jpeg b/PR5MkoxXPW-128-DSxREojv.jpeg
new file mode 100644
index 0000000..9866c08
Binary files /dev/null and b/PR5MkoxXPW-128-DSxREojv.jpeg differ
diff --git a/PR5MkoxXPW-259-BxgBbYhv.jpeg b/PR5MkoxXPW-259-BxgBbYhv.jpeg
new file mode 100644
index 0000000..503e536
Binary files /dev/null and b/PR5MkoxXPW-259-BxgBbYhv.jpeg differ
diff --git a/PR5MkoxXPW-259-Cz8ptoQb.avif b/PR5MkoxXPW-259-Cz8ptoQb.avif
new file mode 100644
index 0000000..edafa40
Binary files /dev/null and b/PR5MkoxXPW-259-Cz8ptoQb.avif differ
diff --git a/README.md b/README.md
deleted file mode 100644
index 226e2f6..0000000
--- a/README.md
+++ /dev/null
@@ -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`
diff --git a/VaCujlDHea-128-BU6Jl8mT.jpeg b/VaCujlDHea-128-BU6Jl8mT.jpeg
new file mode 100644
index 0000000..365f926
Binary files /dev/null and b/VaCujlDHea-128-BU6Jl8mT.jpeg differ
diff --git a/VaCujlDHea-128-BeVD9qYI.avif b/VaCujlDHea-128-BeVD9qYI.avif
new file mode 100644
index 0000000..01989b4
Binary files /dev/null and b/VaCujlDHea-128-BeVD9qYI.avif differ
diff --git a/VaCujlDHea-267-CYPIja1K.avif b/VaCujlDHea-267-CYPIja1K.avif
new file mode 100644
index 0000000..2e1c716
Binary files /dev/null and b/VaCujlDHea-267-CYPIja1K.avif differ
diff --git a/VaCujlDHea-267-Dc_-QPB_.jpeg b/VaCujlDHea-267-Dc_-QPB_.jpeg
new file mode 100644
index 0000000..098c4bb
Binary files /dev/null and b/VaCujlDHea-267-Dc_-QPB_.jpeg differ
diff --git a/WVxiCgEZpG-128-BJBotnh0.avif b/WVxiCgEZpG-128-BJBotnh0.avif
new file mode 100644
index 0000000..28b34eb
Binary files /dev/null and b/WVxiCgEZpG-128-BJBotnh0.avif differ
diff --git a/WVxiCgEZpG-128-BnQ7zj2k.jpeg b/WVxiCgEZpG-128-BnQ7zj2k.jpeg
new file mode 100644
index 0000000..67ef596
Binary files /dev/null and b/WVxiCgEZpG-128-BnQ7zj2k.jpeg differ
diff --git a/WVxiCgEZpG-254-BxaYAhly.avif b/WVxiCgEZpG-254-BxaYAhly.avif
new file mode 100644
index 0000000..394bd5f
Binary files /dev/null and b/WVxiCgEZpG-254-BxaYAhly.avif differ
diff --git a/WVxiCgEZpG-254-Ye_Hm3ug.jpeg b/WVxiCgEZpG-254-Ye_Hm3ug.jpeg
new file mode 100644
index 0000000..4e31775
Binary files /dev/null and b/WVxiCgEZpG-254-Ye_Hm3ug.jpeg differ
diff --git a/aKOUNQnxge-384-DDtihwdd.jpeg b/aKOUNQnxge-384-DDtihwdd.jpeg
new file mode 100644
index 0000000..69c5621
Binary files /dev/null and b/aKOUNQnxge-384-DDtihwdd.jpeg differ
diff --git a/aKOUNQnxge-384-HdyxQDmf.avif b/aKOUNQnxge-384-HdyxQDmf.avif
new file mode 100644
index 0000000..234ae67
Binary files /dev/null and b/aKOUNQnxge-384-HdyxQDmf.avif differ
diff --git a/aKOUNQnxge-592-C2vhHsNU.jpeg b/aKOUNQnxge-592-C2vhHsNU.jpeg
new file mode 100644
index 0000000..aefc5ba
Binary files /dev/null and b/aKOUNQnxge-592-C2vhHsNU.jpeg differ
diff --git a/aKOUNQnxge-592-Cqu0uphv.avif b/aKOUNQnxge-592-Cqu0uphv.avif
new file mode 100644
index 0000000..0e39e3e
Binary files /dev/null and b/aKOUNQnxge-592-Cqu0uphv.avif differ
diff --git a/about/index.html b/about/index.html
new file mode 100644
index 0000000..046394d
--- /dev/null
+++ b/about/index.html
@@ -0,0 +1 @@
+
About - joshua.seigler.net
About
I’m the oldest of four boys, raised in a Christian home in Virginia. My parents homeschooled us, and the drive this gave me to learn new things and try them out has been a big help in my life. I’m naturally introverted, but I can present as extroverted: I love connecting with people, but quiet time to myself is how I recharge.
After college I took some time figuring out what being an adult looked like for me. In 2010 after some priceless education in communication (thanks to a Dish Network tech support job) and conflict resolution (thanks to my housemates at the time) I started my first engineering job up in Connecticut.
Straight away I met my wife Sara. We started dating and it was clear we were compatibly weird. Pretty soon we got married. We like board games, food trucks, black cats, mini golf, and scenic road trips.
One job led to another, and we moved around between Connecticut, Rhode Island, and Massachusetts. In 2017 I took a risk and started working remotely for a cryptocurrency company. Remote work was a big adjustment, but that unique role had lots of opportunities for travel and proved to be a good preparation for working remotely in smaller companies.
The societal metamorphosis of 2019-2021 came at a time when I was also exploring a values shift, from politics as a source-of-truth back to faith, and I started trying to learn to see the world mystically. This began a change in my orientation that is still playing out.
In my next few roles, I found that I have a taste for the laser focus and fast pace of startups. I like building exciting new things, talking to customers, owning whole sections of the product, juggling priorities, and balancing clean perfection against shipping quickly.
I don’t know what tomorrow holds, but I’m sure it’s going to be great.
QI Path is a startup offering a risk analysis platform. This platform helps decision makers in a variety of industries accurately assess risk, so they can make decisions with an awareness of hidden vulnerabilities and minimize quality and safety issues. This role also re-connects me with a college friend!
Capabuild is a web and mobile platform for disaster recovery companies. This role was an unexpectedly great fit for some technologies I used in side projects: THREE.js and SVG. Here I worked with other experienced engineers building new things and continuously balancing speed and sustainability. Startup life is exciting! Priorities can change quickly, and in this role I could see every day how my work and execution could help our customers, and ultimately make the business a success. In this role I learned to accept and also pay down tech debt, and experienced the value of investing time into a good development environment.
This role was at the intersection of many interests, including learning, communication, and decentralized solutions. Here I learned to own, plan, and solve larger and less-well-defined tasks. Prenda has an excellent and intentional culture that fosters humility and recognizes others’ humanity.
Back in the corporate world, using my experience to develop React projects in an agile environment. I began building my mentoring and team management abilities, as well as sharpening my JavaScript and React skills.
After some successful freelance work, I became a full time contractor, working remotely. I was fortunate to sometimes travel to interesting places to represent Dash or to meet up worldwide with other developers. My focus here was on web development, React Native app development, and JavaScript API testing and documentation.
Microsoft environment, Agile methodology. This fully front-end focused role highlighted the value of investing in myself and building a skillset focused around my strengths and interests. Outside of work, I began deeply researching cryptocurrencies and economics and using open source web development tools for personal projects.
This Microsoft based company was a good first step into corporate development. I was exposed to a variety of development roles, and began building a personal specialization in front-end development. Also, shortly after moving for this job, I met my wife!
Exploring
This includes about a year of small-business home computer repair, as well as some valuable time improving my communication skills at a satellite TV tech support center.
Part time teacher / E-learning Technician
After a couple semesters as a part time math instructor at my old community college, I switched to a role supporting instructors with remote learning, software assistance, and classroom technology. This is also when my love of board games really exploded. Local friends had an extensive game collection and we used to play until late at night.
Highlights include a public speaking class and an excellent Java programming class, my introduction to object-oriented programming. I have such fond memories of the teachers here and their dedicated enthusiasm.
First community college course
“Calculus with Analytic Geometry I”. I showed my teacher a Newton’s method root-finder program I made for my TI-83 calculator, and at the end of class she surprised me by having me demonstrate it to the class. When I asked why she hadn’t given me any warning, she asked, “Would that have made you less nervous?”
Homeschooled
Reading, field trips, spelling bees. Developing interest in math, art, and computers. As long as I stayed ahead of the baseline public school standards, I could explore whatever interested me. What a great beginning. Big thanks to my parents for nurturing my appetite for learning. Thanks also to my brothers for teaching me patience and conflict resolution!
Hello World
\ No newline at end of file
diff --git a/assets/android-chrome-192x192.png b/android-chrome-192x192.png
similarity index 100%
rename from assets/android-chrome-192x192.png
rename to android-chrome-192x192.png
diff --git a/assets/android-chrome-512x512.png b/android-chrome-512x512.png
similarity index 100%
rename from assets/android-chrome-512x512.png
rename to android-chrome-512x512.png
diff --git a/assets/apple-touch-icon.png b/apple-touch-icon.png
similarity index 100%
rename from assets/apple-touch-icon.png
rename to apple-touch-icon.png
diff --git a/aqrGvznrBK-384-QCCzfdFY.avif b/aqrGvznrBK-384-QCCzfdFY.avif
new file mode 100644
index 0000000..4653442
Binary files /dev/null and b/aqrGvznrBK-384-QCCzfdFY.avif differ
diff --git a/aqrGvznrBK-384-tyudDfDS.jpeg b/aqrGvznrBK-384-tyudDfDS.jpeg
new file mode 100644
index 0000000..2e6e418
Binary files /dev/null and b/aqrGvznrBK-384-tyudDfDS.jpeg differ
diff --git a/aqrGvznrBK-471-B0vJoUEo.jpeg b/aqrGvznrBK-471-B0vJoUEo.jpeg
new file mode 100644
index 0000000..d877a9f
Binary files /dev/null and b/aqrGvznrBK-471-B0vJoUEo.jpeg differ
diff --git a/aqrGvznrBK-471-wJhv2Ek7.avif b/aqrGvznrBK-471-wJhv2Ek7.avif
new file mode 100644
index 0000000..ada65ae
Binary files /dev/null and b/aqrGvznrBK-471-wJhv2Ek7.avif differ
diff --git a/assets/art/cloudscape/cloud.png b/art/cloudscape/cloud.png
similarity index 100%
rename from assets/art/cloudscape/cloud.png
rename to art/cloudscape/cloud.png
diff --git a/assets/art/cloudscape/index.html b/art/cloudscape/index.html
similarity index 100%
rename from assets/art/cloudscape/index.html
rename to art/cloudscape/index.html
diff --git a/assets/art/rothko/index.html b/art/rothko/index.html
similarity index 100%
rename from assets/art/rothko/index.html
rename to art/rothko/index.html
diff --git a/assets/-IYuxB_Iur-1152-wb3dEoW4.jpeg b/assets/-IYuxB_Iur-1152-wb3dEoW4.jpeg
new file mode 100644
index 0000000..9ff9ceb
Binary files /dev/null and b/assets/-IYuxB_Iur-1152-wb3dEoW4.jpeg differ
diff --git a/assets/-IYuxB_Iur-1280-cgTSeSNs.jpeg b/assets/-IYuxB_Iur-1280-cgTSeSNs.jpeg
new file mode 100644
index 0000000..1df9626
Binary files /dev/null and b/assets/-IYuxB_Iur-1280-cgTSeSNs.jpeg differ
diff --git a/assets/31JQodtCZd-128-B7DUbFN5.jpeg b/assets/31JQodtCZd-128-B7DUbFN5.jpeg
new file mode 100644
index 0000000..b34f4b3
Binary files /dev/null and b/assets/31JQodtCZd-128-B7DUbFN5.jpeg differ
diff --git a/assets/31JQodtCZd-263-B9kfNm_J.avif b/assets/31JQodtCZd-263-B9kfNm_J.avif
new file mode 100644
index 0000000..eb026a4
Binary files /dev/null and b/assets/31JQodtCZd-263-B9kfNm_J.avif differ
diff --git a/assets/31JQodtCZd-263-HxN8CM5g.jpeg b/assets/31JQodtCZd-263-HxN8CM5g.jpeg
new file mode 100644
index 0000000..ba809fa
Binary files /dev/null and b/assets/31JQodtCZd-263-HxN8CM5g.jpeg differ
diff --git a/assets/4FEYDkJPXb-128-CHFUdODc.jpeg b/assets/4FEYDkJPXb-128-CHFUdODc.jpeg
new file mode 100644
index 0000000..dac88a6
Binary files /dev/null and b/assets/4FEYDkJPXb-128-CHFUdODc.jpeg differ
diff --git a/assets/4FEYDkJPXb-128-CTtHsZRd.avif b/assets/4FEYDkJPXb-128-CTtHsZRd.avif
new file mode 100644
index 0000000..c179889
Binary files /dev/null and b/assets/4FEYDkJPXb-128-CTtHsZRd.avif differ
diff --git a/assets/4FEYDkJPXb-306-BvPZTm4x.avif b/assets/4FEYDkJPXb-306-BvPZTm4x.avif
new file mode 100644
index 0000000..07753bc
Binary files /dev/null and b/assets/4FEYDkJPXb-306-BvPZTm4x.avif differ
diff --git a/assets/4FEYDkJPXb-306-mG1HfCAy.jpeg b/assets/4FEYDkJPXb-306-mG1HfCAy.jpeg
new file mode 100644
index 0000000..e6c0995
Binary files /dev/null and b/assets/4FEYDkJPXb-306-mG1HfCAy.jpeg differ
diff --git a/assets/CiefJuzBPy-128-BiFuRkEh.jpeg b/assets/CiefJuzBPy-128-BiFuRkEh.jpeg
new file mode 100644
index 0000000..0aaee62
Binary files /dev/null and b/assets/CiefJuzBPy-128-BiFuRkEh.jpeg differ
diff --git a/assets/CiefJuzBPy-258-BH0FB1hO.avif b/assets/CiefJuzBPy-258-BH0FB1hO.avif
new file mode 100644
index 0000000..cda5d32
Binary files /dev/null and b/assets/CiefJuzBPy-258-BH0FB1hO.avif differ
diff --git a/assets/CiefJuzBPy-258-DUfUtPiz.jpeg b/assets/CiefJuzBPy-258-DUfUtPiz.jpeg
new file mode 100644
index 0000000..8662744
Binary files /dev/null and b/assets/CiefJuzBPy-258-DUfUtPiz.jpeg differ
diff --git a/assets/DYlrbvNwH--1152-CFoGP2ol.avif b/assets/DYlrbvNwH--1152-CFoGP2ol.avif
new file mode 100644
index 0000000..bca286f
Binary files /dev/null and b/assets/DYlrbvNwH--1152-CFoGP2ol.avif differ
diff --git a/assets/DYlrbvNwH--1152-ngK3SfkN.jpeg b/assets/DYlrbvNwH--1152-ngK3SfkN.jpeg
new file mode 100644
index 0000000..50d689c
Binary files /dev/null and b/assets/DYlrbvNwH--1152-ngK3SfkN.jpeg differ
diff --git a/assets/DYlrbvNwH--1280-7fOlr9wV.avif b/assets/DYlrbvNwH--1280-7fOlr9wV.avif
new file mode 100644
index 0000000..e4a1e17
Binary files /dev/null and b/assets/DYlrbvNwH--1280-7fOlr9wV.avif differ
diff --git a/assets/DYlrbvNwH--1280-DN7XhumV.jpeg b/assets/DYlrbvNwH--1280-DN7XhumV.jpeg
new file mode 100644
index 0000000..76b59c1
Binary files /dev/null and b/assets/DYlrbvNwH--1280-DN7XhumV.jpeg differ
diff --git a/assets/DYlrbvNwH--384-BXjTSUwJ.avif b/assets/DYlrbvNwH--384-BXjTSUwJ.avif
new file mode 100644
index 0000000..3eea760
Binary files /dev/null and b/assets/DYlrbvNwH--384-BXjTSUwJ.avif differ
diff --git a/assets/DYlrbvNwH--384-DIgEa-dN.jpeg b/assets/DYlrbvNwH--384-DIgEa-dN.jpeg
new file mode 100644
index 0000000..b20216a
Binary files /dev/null and b/assets/DYlrbvNwH--384-DIgEa-dN.jpeg differ
diff --git a/assets/K3T_iHask9-128-BpMLJT5N.jpeg b/assets/K3T_iHask9-128-BpMLJT5N.jpeg
new file mode 100644
index 0000000..d7a833a
Binary files /dev/null and b/assets/K3T_iHask9-128-BpMLJT5N.jpeg differ
diff --git a/assets/K3T_iHask9-128-QoHBjVQp.avif b/assets/K3T_iHask9-128-QoHBjVQp.avif
new file mode 100644
index 0000000..5138a4e
Binary files /dev/null and b/assets/K3T_iHask9-128-QoHBjVQp.avif differ
diff --git a/assets/K3T_iHask9-267-B2WMLbag.jpeg b/assets/K3T_iHask9-267-B2WMLbag.jpeg
new file mode 100644
index 0000000..c35f080
Binary files /dev/null and b/assets/K3T_iHask9-267-B2WMLbag.jpeg differ
diff --git a/assets/K3T_iHask9-267-B6jWopeS.avif b/assets/K3T_iHask9-267-B6jWopeS.avif
new file mode 100644
index 0000000..45b1250
Binary files /dev/null and b/assets/K3T_iHask9-267-B6jWopeS.avif differ
diff --git a/assets/PR5MkoxXPW-128-CqBOAmRm.avif b/assets/PR5MkoxXPW-128-CqBOAmRm.avif
new file mode 100644
index 0000000..94e0766
Binary files /dev/null and b/assets/PR5MkoxXPW-128-CqBOAmRm.avif differ
diff --git a/assets/PR5MkoxXPW-128-DSxREojv.jpeg b/assets/PR5MkoxXPW-128-DSxREojv.jpeg
new file mode 100644
index 0000000..9866c08
Binary files /dev/null and b/assets/PR5MkoxXPW-128-DSxREojv.jpeg differ
diff --git a/assets/PR5MkoxXPW-259-BxgBbYhv.jpeg b/assets/PR5MkoxXPW-259-BxgBbYhv.jpeg
new file mode 100644
index 0000000..503e536
Binary files /dev/null and b/assets/PR5MkoxXPW-259-BxgBbYhv.jpeg differ
diff --git a/assets/PR5MkoxXPW-259-Cz8ptoQb.avif b/assets/PR5MkoxXPW-259-Cz8ptoQb.avif
new file mode 100644
index 0000000..edafa40
Binary files /dev/null and b/assets/PR5MkoxXPW-259-Cz8ptoQb.avif differ
diff --git a/assets/VaCujlDHea-128-BU6Jl8mT.jpeg b/assets/VaCujlDHea-128-BU6Jl8mT.jpeg
new file mode 100644
index 0000000..365f926
Binary files /dev/null and b/assets/VaCujlDHea-128-BU6Jl8mT.jpeg differ
diff --git a/assets/VaCujlDHea-128-BeVD9qYI.avif b/assets/VaCujlDHea-128-BeVD9qYI.avif
new file mode 100644
index 0000000..01989b4
Binary files /dev/null and b/assets/VaCujlDHea-128-BeVD9qYI.avif differ
diff --git a/assets/VaCujlDHea-267-CYPIja1K.avif b/assets/VaCujlDHea-267-CYPIja1K.avif
new file mode 100644
index 0000000..2e1c716
Binary files /dev/null and b/assets/VaCujlDHea-267-CYPIja1K.avif differ
diff --git a/assets/VaCujlDHea-267-Dc_-QPB_.jpeg b/assets/VaCujlDHea-267-Dc_-QPB_.jpeg
new file mode 100644
index 0000000..098c4bb
Binary files /dev/null and b/assets/VaCujlDHea-267-Dc_-QPB_.jpeg differ
diff --git a/assets/WVxiCgEZpG-128-BJBotnh0.avif b/assets/WVxiCgEZpG-128-BJBotnh0.avif
new file mode 100644
index 0000000..28b34eb
Binary files /dev/null and b/assets/WVxiCgEZpG-128-BJBotnh0.avif differ
diff --git a/assets/WVxiCgEZpG-128-BnQ7zj2k.jpeg b/assets/WVxiCgEZpG-128-BnQ7zj2k.jpeg
new file mode 100644
index 0000000..67ef596
Binary files /dev/null and b/assets/WVxiCgEZpG-128-BnQ7zj2k.jpeg differ
diff --git a/assets/WVxiCgEZpG-254-BxaYAhly.avif b/assets/WVxiCgEZpG-254-BxaYAhly.avif
new file mode 100644
index 0000000..394bd5f
Binary files /dev/null and b/assets/WVxiCgEZpG-254-BxaYAhly.avif differ
diff --git a/assets/WVxiCgEZpG-254-Ye_Hm3ug.jpeg b/assets/WVxiCgEZpG-254-Ye_Hm3ug.jpeg
new file mode 100644
index 0000000..4e31775
Binary files /dev/null and b/assets/WVxiCgEZpG-254-Ye_Hm3ug.jpeg differ
diff --git a/assets/aKOUNQnxge-384-DDtihwdd.jpeg b/assets/aKOUNQnxge-384-DDtihwdd.jpeg
new file mode 100644
index 0000000..69c5621
Binary files /dev/null and b/assets/aKOUNQnxge-384-DDtihwdd.jpeg differ
diff --git a/assets/aKOUNQnxge-384-HdyxQDmf.avif b/assets/aKOUNQnxge-384-HdyxQDmf.avif
new file mode 100644
index 0000000..234ae67
Binary files /dev/null and b/assets/aKOUNQnxge-384-HdyxQDmf.avif differ
diff --git a/assets/aKOUNQnxge-592-C2vhHsNU.jpeg b/assets/aKOUNQnxge-592-C2vhHsNU.jpeg
new file mode 100644
index 0000000..aefc5ba
Binary files /dev/null and b/assets/aKOUNQnxge-592-C2vhHsNU.jpeg differ
diff --git a/assets/aKOUNQnxge-592-Cqu0uphv.avif b/assets/aKOUNQnxge-592-Cqu0uphv.avif
new file mode 100644
index 0000000..0e39e3e
Binary files /dev/null and b/assets/aKOUNQnxge-592-Cqu0uphv.avif differ
diff --git a/assets/aqrGvznrBK-384-QCCzfdFY.avif b/assets/aqrGvznrBK-384-QCCzfdFY.avif
new file mode 100644
index 0000000..4653442
Binary files /dev/null and b/assets/aqrGvznrBK-384-QCCzfdFY.avif differ
diff --git a/assets/aqrGvznrBK-384-tyudDfDS.jpeg b/assets/aqrGvznrBK-384-tyudDfDS.jpeg
new file mode 100644
index 0000000..2e6e418
Binary files /dev/null and b/assets/aqrGvznrBK-384-tyudDfDS.jpeg differ
diff --git a/assets/aqrGvznrBK-471-B0vJoUEo.jpeg b/assets/aqrGvznrBK-471-B0vJoUEo.jpeg
new file mode 100644
index 0000000..d877a9f
Binary files /dev/null and b/assets/aqrGvznrBK-471-B0vJoUEo.jpeg differ
diff --git a/assets/aqrGvznrBK-471-wJhv2Ek7.avif b/assets/aqrGvznrBK-471-wJhv2Ek7.avif
new file mode 100644
index 0000000..ada65ae
Binary files /dev/null and b/assets/aqrGvznrBK-471-wJhv2Ek7.avif differ
diff --git a/assets/feed-Co0rJ30x.xml b/assets/feed-Co0rJ30x.xml
new file mode 100644
index 0000000..f3713e2
--- /dev/null
+++ b/assets/feed-Co0rJ30x.xml
@@ -0,0 +1,994 @@
+
+
+
+ joshua.seigler.net
+ Personal homepage of Joshua Seigler
+
+
+ 2025-06-28T00:00:00Z
+ https://joshua.seigler.net/
+
+
+
+
+ Link: The EU as suicide pact, or: How Germany is slowly dismantling its electrical grid and why the EU won't let them fix it
+
+ 2025-07-09T00:18:20Z
+ https://www.eugyppius.com/p/the-eu-as-suicide-pact-or-how-germany
+
+
+
+
+ Link: Voice of God - The Truth About AI Assistants
+
+ 2025-07-06T18:32:46Z
+ https://backlit.neocities.org/voice-of-god-the-truth-about-ai-assistants.html
+ <div class="markdown"><p>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. </p></div>
+
+
+
+ Link: htmz - a low power tool for html
+
+ 2025-07-01T19:01:52Z
+ https://leanrada.com/htmz/
+ <div class="markdown"><p>Super clever approach for putting HTML into other HTML. "Is it a framework? It's a snippet."</p></div>
+
+
+
+ Recipe: Chicken Chili Verde
+
+ 2025-07-01T00:00:00Z
+ https://joshua.seigler.net/recipes/chicken-chili-verde/
+ <p>Serves six. Prep 20 minutes, cooking time about 1 hour. Mildly spicy. Requires an immersion blender or kitchen blender.</p>
+<h2 id="ingredients" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/chicken-chili-verde/#ingredients" aria-hidden="true"></a> Ingredients</h2>
+<ul>
+<li>1-3 jalapeño peppers</li>
+<li>1 Anaheim or Cubanelle pepper</li>
+<li>6 tomatillos</li>
+<li>2 large chicken breasts</li>
+<li>1 large white onion</li>
+<li>1 head of garlic</li>
+<li>3 cups chicken stock</li>
+<li>2 tsp neutral oil</li>
+<li>Salt</li>
+<li>Pepper</li>
+<li>1 lime</li>
+<li>1 tsp oregano</li>
+<li>Fresh cilantro, optional</li>
+<li>3 cups white rice</li>
+</ul>
+<h2 id="directions" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/chicken-chili-verde/#directions" aria-hidden="true"></a> Directions</h2>
+<ol>
+<li>Rough chop the onion. Dice a little bit and set aside for a garnish.</li>
+<li>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.</li>
+<li>While that cooks, deseed the peppers.</li>
+<li>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.</li>
+<li>Set aside the seared veggies. Cook the rice by your preferred method.</li>
+<li>When the chicken is done simmering, remove the breasts and add the broth, onions, etc to the veggies.</li>
+<li>Add to the mixture half the lime juice, and salt, pepper, oregano, and cilantro.</li>
+<li>Blend until very smooth.</li>
+<li>Shred the chicken breasts with forks and add to the mixture.</li>
+<li>Heat the mixture, covered, over medium heat for 15 minutes.</li>
+<li>Serve over rice and garnish with diced onion and lime juice.</li>
+</ol>
+<h2 id="notes" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/chicken-chili-verde/#notes" aria-hidden="true"></a> Notes</h2>
+<p>You can use jarred minced garlic instead of fresh, just delay adding it when you char the veggies because it will burn easily.<br>
+Original recipe from <a href="https://www.tiktok.com/@oldscoolkevmo/video/7520712000826133791" target="_blank" rel="noopener">Kevin Ashton</a>.</p>
+<h2 id="nutrition-information" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/chicken-chili-verde/#nutrition-information" aria-hidden="true"></a> Nutrition Information</h2>
+<p>Makes 6 389g servings. Each serving: <strong>Calories</strong>: 558kcal (26%), <strong>Protein</strong>: 28.18g (52%), <strong>Total Fat</strong>: 11.64g (24%), Cholesterol: 64mg, Saturated Fat: 3g, Trans Fat: 0.11g, <strong>Carbohydrates</strong>: 82.35g (34%), Dietary Fiber: 3.9g (16%), Sugars: 3.11g, <strong>Calcium</strong>: 45mg (5%), <strong>Iron</strong>: 2.72mg (15%), <strong>Potassium</strong>: 474mg (10%), <strong>Sodium</strong>: 584mg (39%)</p>
+
+
+
+ Link: Speed Catan - seanmcp.com
+
+ 2025-06-29T03:05:58Z
+ https://www.seanmcp.com/board-games/speed-catan/
+ <div class="markdown"><blockquote>
+<p>Speed Catan is a variation of the popular board game Catan that emphasizes game speed and simplicity for younger (or impatient) players.</p>
+</blockquote></div>
+
+
+
+ Link: How to Surf the Web in 2025, and Why You Should
+
+ 2025-06-28T22:20:45Z
+ https://www.raptitude.com/2025/06/how-to-surf-the-web-in-2025-and-why-you-should/
+ <div class="markdown"><blockquote>
+<p>Just as it’s still possible (though seldom necessary) to ride a horse, it is still possible to surf the internet. It’s a thrill not yet lost to time.</p>
+</blockquote></div>
+
+
+
+ Post: Alternate rules for Bananagrams
+
+ 2025-06-28T00:00:00Z
+ https://joshua.seigler.net/posts/alternate-rules-for-bananagrams/
+ <p>Digging through old bookmarks I found this alternate ruleset for Bananagrams I want to share:</p>
+<blockquote>
+<p>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.</p>
+<p>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.</p>
+<p>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.</p>
+<p>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.</p>
+<p>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.</p>
+</blockquote>
+<p>Reproduced with light editing from <a href="https://boardgamegeek.com/thread/563175/article/5516061#5516061" target="_blank" rel="noopener">Houserule Jay @ BoardGameGeek</a></p>
+
+
+
+ Link: Comic Helvetic Font | dafont.com
+
+ 2025-06-26T14:29:51Z
+ https://www.dafont.com/comic-helvetic.font
+ <div class="markdown"><p>I don't understand why this feels ok but Comic Sans makes my skin crawl.</p></div>
+
+
+
+ Post: FFmpeg audio cleanup
+
+ 2025-06-26T00:00:00Z
+ https://joshua.seigler.net/posts/ffmpeg-audio-cleanup/
+ <p>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.</p>
+<p>Although I could do it easily with <a href="https://tenacityaudio.org/" target="_blank" rel="noopener">Tenacity</a> I didn’t want to use a manual process, since it would take days. So I tried using FFmpeg filters and Bash scripting.</p>
+<p>I found an FFmpeg filter called <a href="https://ffmpeg.org/ffmpeg-filters.html#compand" target="_blank" rel="noopener">compand</a> which lets you map an input decibel range to an output decibel range. I also used the <a href="https://ffmpeg.org/ffmpeg-filters.html#anlmdn" target="_blank" rel="noopener">anlmdn</a> filter to reduce noise, and the <a href="https://ffmpeg.org/ffmpeg-filters.html#highpass" target="_blank" rel="noopener">highpass</a> filter to help with clarity.</p>
+<p>I ran into a couple gotchas.</p>
+<ol>
+<li><code>mpv</code> does something special for audio playback that prevents audio from clipping. <code>vlc</code> plays the file as it is.</li>
+<li>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 <code>delay</code> parameter with half the duration of the attack length fixed this.</li>
+</ol>
+<p>Here is the script:</p>
+<p><code>process-audio.sh</code></p>
+<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token shebang important">#!/bin/bash</span></span>
+<span class="highlight-line"><span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$#</span>"</span> <span class="token operator">==</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></span>
+<span class="highlight-line"> <span class="token builtin class-name">echo</span> <span class="token string">"Error: no arguments provided."</span></span>
+<span class="highlight-line"> <span class="token builtin class-name">echo</span> <span class="token string">"Usage: <span class="token variable">$0</span> file1 file2 file3 ..."</span></span>
+<span class="highlight-line"> <span class="token builtin class-name">echo</span> <span class="token string">"or <span class="token variable">$0</span> *.ext"</span></span>
+<span class="highlight-line"> <span class="token builtin class-name">exit</span> <span class="token number">1</span></span>
+<span class="highlight-line"><span class="token keyword">fi</span></span>
+<span class="highlight-line"></span>
+<span class="highlight-line"><span class="token builtin class-name">trap</span> <span class="token string">"exit"</span> INT</span>
+<span class="highlight-line"></span>
+<span class="highlight-line"><span class="token keyword">while</span> <span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$#</span>"</span> <span class="token operator">!=</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">do</span></span>
+<span class="highlight-line"> <span class="token assign-left variable">path</span><span class="token operator">=</span><span class="token string">"<span class="token variable">${1<span class="token operator">%</span><span class="token operator">/</span>*}</span>"</span></span>
+<span class="highlight-line"> <span class="token assign-left variable">file</span><span class="token operator">=</span><span class="token string">"<span class="token variable">${1<span class="token operator">##</span>*<span class="token operator">/</span>}</span>"</span></span>
+<span class="highlight-line"> <span class="token assign-left variable">outfile</span><span class="token operator">=</span><span class="token string">"./normalized--<span class="token variable">$file</span>"</span></span>
+<span class="highlight-line"> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token operator">!</span> <span class="token parameter variable">-f</span> <span class="token string">"<span class="token variable">$outfile</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></span>
+<span class="highlight-line"> <span class="token builtin class-name">echo</span> <span class="token string">"Processing <span class="token variable">$1</span>"</span></span>
+<span class="highlight-line"> ffmpeg <span class="token parameter variable">-i</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token parameter variable">-v</span> warning <span class="token parameter variable">-ac</span> <span class="token number">1</span> <span class="token parameter variable">-af</span> <span class="token string">"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"</span> <span class="token parameter variable">-threads</span> <span class="token number">4</span> <span class="token string">"<span class="token variable">$outfile</span>"</span></span>
+<span class="highlight-line"> <span class="token keyword">else</span></span>
+<span class="highlight-line"> <span class="token builtin class-name">echo</span> <span class="token string">"Skipping <span class="token variable">$1</span>, already processed."</span></span>
+<span class="highlight-line"> <span class="token keyword">fi</span></span>
+<span class="highlight-line"> <span class="token builtin class-name">shift</span></span>
+<span class="highlight-line"><span class="token keyword">done</span></span></code></pre>
+<p>If this is useful to you please leave a comment or send an email, I would love to hear about it.</p>
+
+
+
+ Post: War
+
+ 2025-06-21T00:00:00Z
+ https://joshua.seigler.net/posts/july-21-2025/
+ <p>Today the USA announced its bombing of three locations in Iran, including Iran’s main nuclear enrichment site, located under a mountain in Fordow. How far will things go?</p>
+<p>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<sup class="footnote-ref"><a href="https://joshua.seigler.net/posts/july-21-2025/#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup>:</p>
+<blockquote class="feature">
+<p>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.</p>
+<p>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.</p>
+<p>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.</p>
+<p>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: <em>“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)</em>.</p>
+</blockquote>
+<p>May we not be tested beyond what we can bear, and may we have indestructible peace that is not of this world.</p>
+<hr class="footnotes-sep">
+<section class="footnotes">
+<ol class="footnotes-list">
+<li id="footnote1" class="footnote-item"><p>Quote copied from <a href="https://www.stnektariosmonastery.org/repentance-and-confession/This%20Life%20Has%20Been%20Given%20to%20Us%20for%20Repentance%20-%20St.%20Isaac%20the%20Syrian.pdf" target="_blank" rel="noopener">St. Nectarios Monastery</a> and <a href="https://orthodoxwiki.org/Isaac_of_Syria" target="_blank" rel="noopener">OrthodoxWiki</a> <a href="https://joshua.seigler.net/posts/july-21-2025/#footnote-ref1" class="footnote-backref">↩︎</a></p>
+</li>
+</ol>
+</section>
+
+
+
+ Link: NIKA:\git-revise\>
+
+ 2025-06-18T16:18:36Z
+ https://mystor.github.io/git-revise.html
+ <div class="markdown"><p>git-revise is a history editing tool designed for the patch-stack workflow. It's fast, non-destructive, and aims to provide a familiar, powerful, and easy to use re-imagining of the patch stack workflow.</p></div>
+
+
+
+ Link: Markdown Code Blocks With a Title / Filename - Lusitos Tech Blog
+
+ 2025-06-15T02:28:23Z
+ https://blog.lusito.info/markdown-code-blocks-with-a-title-filename.html
+ <div class="markdown"><p>Smart alternative to immediately using some kind of markdown extension or plugin. Good perspective.</p></div>
+
+
+
+ Post: My Very Own GitHub Pages
+
+ 2025-06-15T00:00:00Z
+ https://joshua.seigler.net/posts/my-very-own-github-pages/
+ <p>I recently started self-hosting <a href="https://forgejo.org/" target="_blank" rel="noopener">Forgejo</a>, 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 <a href="https://github.com/adnanh/webhook" target="_blank" rel="noopener">webhook</a> and <a href="https://caddyserver.com/" target="_blank" rel="noopener">Caddy</a>. I’m very happy how it turned out.</p>
+<h2 id="the-objective" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#the-objective" aria-hidden="true"></a> The objective</h2>
+<p>When I push a <code>gh-pages</code> branch to any public repository on my Forgejo instance, the name of the repo is used as a domain name (e.g. <a href="https://marklink.pages.seigler.net/" target="_blank" rel="noopener">marklink.pages.seigler.net</a>) 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.</p>
+<h2 id="how-to-do-it" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#how-to-do-it" aria-hidden="true"></a> How to do it</h2>
+<h3 id="debian-server-preparation" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#debian-server-preparation" aria-hidden="true"></a> Debian server preparation</h3>
+<p>In case you don’t have a basic server setup routine yet, this is a good start:</p>
+<ul>
+<li>Change the default root password.</li>
+<li>Create a new user and add it to the sudo group. In my examples below the user is <code>joshua</code>.</li>
+<li>Use <code>ssh-copy-id</code> to install your ssl pubkey for easier login.</li>
+<li>Disable/lock root’s password.</li>
+<li>Disable root login over ssh and change the SSL port number. Pick a new port lower than 1024.</li>
+<li>Edit your local <code>~/.ssh/config</code> so you don’t have to specify the port number every time you connect.</li>
+<li>On the server, install and enable <code>ufw</code> and <code>fail2ban</code>. In addition to allowing your custom SSL port, be sure to enable ports 80 and 443 with <code>sudo ufw allow "WWW Full"</code>.</li>
+</ul>
+<h3 id="caddy" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#caddy" aria-hidden="true"></a> Caddy</h3>
+<p>I usually use nginx, but I wanted to give Caddy a shot, and it has been a great experience. I installed Caddy using the <a href="https://caddyserver.com/docs/install" target="_blank" rel="noopener">official instructions</a>.<br>
+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.</p>
+<p><code>/etc/caddy/Caddyfile</code></p>
+<pre class="language-caddy"><code class="language-caddy"><span class="highlight-line"># Global options block</span>
+<span class="highlight-line">{</span>
+<span class="highlight-line"> email you@example.com #### CHANGE THIS ####</span>
+<span class="highlight-line"> on_demand_tls {</span>
+<span class="highlight-line"> ask http://localhost/check</span>
+<span class="highlight-line"> }</span>
+<span class="highlight-line">}</span>
+<span class="highlight-line"></span>
+<span class="highlight-line"># Webhooks</span>
+<span class="highlight-line">https://webhooks.subdomain.here.tld { #### CHANGE THIS ####</span>
+<span class="highlight-line"> reverse_proxy localhost:9000</span>
+<span class="highlight-line">}</span>
+<span class="highlight-line"></span>
+<span class="highlight-line"># Filter for which SSL certs we will create. Prevents abuse.</span>
+<span class="highlight-line">http://localhost {</span>
+<span class="highlight-line"> handle /check {</span>
+<span class="highlight-line"> root * /var/www</span>
+<span class="highlight-line"> @deny not file /{query.domain}/</span>
+<span class="highlight-line"> respond @deny 404</span>
+<span class="highlight-line"> }</span>
+<span class="highlight-line">}</span>
+<span class="highlight-line"></span>
+<span class="highlight-line"># This automatically handles upgrading http:// requests with a redirect</span>
+<span class="highlight-line">https:// {</span>
+<span class="highlight-line"> tls {</span>
+<span class="highlight-line"> on_demand</span>
+<span class="highlight-line"> }</span>
+<span class="highlight-line"> root /var/www</span>
+<span class="highlight-line"> rewrite /{host}{uri}</span>
+<span class="highlight-line"> @forbidden {</span>
+<span class="highlight-line"> path /.*</span>
+<span class="highlight-line"> }</span>
+<span class="highlight-line"> respond @forbidden 404</span>
+<span class="highlight-line"> file_server</span>
+<span class="highlight-line">}</span>
+<span class="highlight-line"></span>
+<span class="highlight-line"># Refer to the Caddy docs for more information:</span>
+<span class="highlight-line"># https://caddyserver.com/docs/caddyfile</span>
+<span class="highlight-line"></span>
+<span class="highlight-line"># This config based on information at</span>
+<span class="highlight-line"># https://caddy.community/t/on-demand-tls-with-dynamic-content-paths/18140</span>
+<span class="highlight-line"># checked and corrected with `caddy validate`</span></code></pre>
+<p>I also took ownership of <code>/var/www</code> with <code>chown -R joshua:joshua /var/www</code> since the webhooks will run as my login account.</p>
+<h3 id="webhooks" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#webhooks" aria-hidden="true"></a> Webhooks</h3>
+<p>In my home directory I defined two hook scripts:</p>
+<p><code>~/webhooks/update-pages.sh</code></p>
+<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token shebang important">#!/bin/bash</span></span>
+<span class="highlight-line"><span class="token comment"># parameter 1 is repo name, parameter 2 is clone url</span></span>
+<span class="highlight-line"><span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token operator">==</span> *<span class="token string">"/"</span>* <span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">&&</span> <span class="token builtin class-name">exit</span> <span class="token number">1</span><span class="token punctuation">;</span></span>
+<span class="highlight-line"><span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token operator">==</span> *<span class="token string">".."</span>* <span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">&&</span> <span class="token builtin class-name">exit</span> <span class="token number">1</span><span class="token punctuation">;</span></span>
+<span class="highlight-line"><span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token operator">==</span> *<span class="token string">"*"</span>* <span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">&&</span> <span class="token builtin class-name">exit</span> <span class="token number">1</span><span class="token punctuation">;</span></span>
+<span class="highlight-line"><span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-d</span> <span class="token string">"/var/www/<span class="token variable">$1</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></span>
+<span class="highlight-line"> <span class="token builtin class-name">cd</span> <span class="token string">"/var/www/<span class="token variable">$1</span>"</span><span class="token punctuation">;</span></span>
+<span class="highlight-line"> <span class="token function">git</span> fetch origin gh-pages<span class="token punctuation">;</span></span>
+<span class="highlight-line"> <span class="token function">git</span> reset <span class="token parameter variable">--hard</span> origin/gh-pages<span class="token punctuation">;</span></span>
+<span class="highlight-line"> <span class="token builtin class-name">exit</span><span class="token punctuation">;</span></span>
+<span class="highlight-line"><span class="token keyword">fi</span><span class="token punctuation">;</span></span>
+<span class="highlight-line"><span class="token function">git</span> clone <span class="token parameter variable">-b</span> gh-pages --single-branch <span class="token string">"<span class="token variable">$2</span>"</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token operator">||</span> <span class="token builtin class-name">exit</span> <span class="token number">1</span><span class="token punctuation">;</span></span></code></pre>
+<p><code>~/webhooks/remove-pages.sh</code></p>
+<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token shebang important">#!/bin/bash</span></span>
+<span class="highlight-line"><span class="token comment"># parameter 1 is repo name</span></span>
+<span class="highlight-line"><span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token operator">==</span> *<span class="token string">"/"</span>* <span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">&&</span> <span class="token builtin class-name">exit</span> <span class="token number">1</span><span class="token punctuation">;</span></span>
+<span class="highlight-line"><span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token operator">==</span> *<span class="token string">".."</span>* <span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">&&</span> <span class="token builtin class-name">exit</span> <span class="token number">1</span><span class="token punctuation">;</span></span>
+<span class="highlight-line"><span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token operator">==</span> *<span class="token string">"*"</span>* <span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">&&</span> <span class="token builtin class-name">exit</span> <span class="token number">1</span><span class="token punctuation">;</span></span>
+<span class="highlight-line"><span class="token punctuation">[</span> <span class="token parameter variable">-d</span> <span class="token string">"/var/www/<span class="token variable">$1</span>"</span> <span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token builtin class-name">exit</span> <span class="token number">1</span><span class="token punctuation">;</span></span>
+<span class="highlight-line"><span class="token builtin class-name">cd</span> <span class="token string">"/var/www"</span><span class="token punctuation">;</span></span>
+<span class="highlight-line"><span class="token function">rm</span> <span class="token parameter variable">-rf</span> <span class="token string">"/var/www/<span class="token variable">$1</span>"</span><span class="token punctuation">;</span></span></code></pre>
+<p>To trigger these hooks I am using <code>webhook</code> which is in the default Debian repository.</p>
+<p>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 <code>uuidgen -r</code> to create mine. Save these values so you can enter them in Forgejo later.</p>
+<p>Also make sure to replace your execute-command lines with ones referencing your username and script paths.</p>
+<p><code>/etc/webhook.conf</code></p>
+<pre class="language-json"><code class="language-json"><span class="highlight-line"><span class="token punctuation">[</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"id"</span><span class="token operator">:</span> <span class="token string">"update-pages"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"execute-command"</span><span class="token operator">:</span> <span class="token string">"/usr/bin/sudo"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"pass-arguments-to-command"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">[</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"string"</span><span class="token punctuation">,</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"-u"</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"string"</span><span class="token punctuation">,</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"joshua"</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"string"</span><span class="token punctuation">,</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"/home/joshua/webhooks/update-pages.sh"</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"payload"</span><span class="token punctuation">,</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"repository.name"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"payload"</span><span class="token punctuation">,</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"repository.clone_url"</span> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">]</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"trigger-rule"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"and"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">[</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"match"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"payload-hmac-sha256"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"secret"</span><span class="token operator">:</span> <span class="token string">"(omitted)"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"parameter"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"header"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"X-Forgejo-Signature"</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"match"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"value"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"value"</span><span class="token operator">:</span> <span class="token string">"refs/heads/gh-pages"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"parameter"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"payload"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"ref"</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">]</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"id"</span><span class="token operator">:</span> <span class="token string">"remove-pages"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"execute-command"</span><span class="token operator">:</span> <span class="token string">"/usr/bin/sudo"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"pass-arguments-to-command"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">[</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"string"</span><span class="token punctuation">,</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"-u"</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"string"</span><span class="token punctuation">,</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"joshua"</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"string"</span><span class="token punctuation">,</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"/home/joshua/webhooks/remove-pages.sh"</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"payload"</span><span class="token punctuation">,</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"repository.name"</span> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">]</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"trigger-rule"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"and"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">[</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"match"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"payload-hmac-sha256"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"secret"</span><span class="token operator">:</span> <span class="token string">"(omitted)"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"parameter"</span><span class="token operator">:</span></span>
+<span class="highlight-line"> <span class="token punctuation">{</span></span>
+<span class="highlight-line"> <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"header"</span><span class="token punctuation">,</span></span>
+<span class="highlight-line"> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"X-Forgejo-Signature"</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">]</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span></span>
+<span class="highlight-line"> <span class="token punctuation">}</span></span>
+<span class="highlight-line"><span class="token punctuation">]</span></span></code></pre>
+<h3 id="forgejo" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#forgejo" aria-hidden="true"></a> Forgejo</h3>
+<p>Forgejo supports running webhooks conditionally triggered by certain conditions.<br>
+Under my main user settings I set up each webhook:</p>
+<h4 id="update-pages" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#update-pages" aria-hidden="true"></a> Update pages</h4>
+<p>Target URL: https:// <em>your domain here</em> /hooks/update-pages<br>
+HTTP Method: <code>POST</code> (the default)<br>
+POST content type: <code>application/json</code> (the default)<br>
+Secret: <em>omitted, use your own</em><br>
+Trigger on: Push events<br>
+Branch filter: <code>gh-pages</code></p>
+<h4 id="remove-pages" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#remove-pages" aria-hidden="true"></a> Remove pages</h4>
+<p>Target URL: https:// <em>your domain here</em> /hooks/remove-pages<br>
+HTTP Method: <code>POST</code> (the default)<br>
+POST content type: <code>application/json</code> (the default)<br>
+Secret: <em>omitted, use your own</em><br>
+Trigger on: Custom Events > Repository > Delete<br>
+Branch filter: <code>gh-pages</code></p>
+<h2 id="conclusion" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#conclusion" aria-hidden="true"></a> Conclusion</h2>
+<p>It works!<br>
+Here is <a href="https://git.apps.seigler.net/joshua/marklink.pages.seigler.net" target="_blank" rel="noopener">the marklink repo in my Forgejo instance</a> and <a href="https://marklink.pages.seigler.net/" target="_blank" rel="noopener">its contents on my Caddy server</a>.</p>
+<p>That repo is just HTML and JS with only a gh-pages branch, but for repos with npm build scripts, I use <a href="https://www.npmjs.com/package/gh-pages" target="_blank" rel="noopener">gh-pages @ npm</a> to push the build to a gh-pages branch and up to the server.</p>
+<p>I’m putting off rolling my own CI server, but I imagine that’s the next stage here. Stay tuned.</p>
+
+
+
+ Link: MidWord! The world's favorite word guessing game
+
+ 2025-06-14T04:28:49Z
+ https://midword.com/
+ <div class="markdown"><p>Just found my new favorite long-car-ride verbal game!</p></div>
+
+
+
+ Recipe: Amish Egg Noodles
+
+ 2025-06-13T00:00:00Z
+ https://joshua.seigler.net/recipes/amish-egg-noodles/
+ <h2 id="ingredients" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/amish-egg-noodles/#ingredients" aria-hidden="true"></a> Ingredients</h2>
+<ul>
+<li>6 tablespoons butter, divided</li>
+<li>28 ounces chicken broth</li>
+<li>1 chicken bouillon cube</li>
+<li>12 ounces extra wide egg noodles</li>
+<li>1 teaspoon parsley flakes</li>
+<li>Salt and pepper, to taste</li>
+</ul>
+<h2 id="instructions" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/amish-egg-noodles/#instructions" aria-hidden="true"></a> Instructions</h2>
+<ul>
+<li>In a large pan, brown two tablespoons of butter over medium heat.</li>
+<li>Pour the chicken stock and bouillon cube into the pan and bring to a boil.</li>
+<li>Add the egg noodles to the chicken stock and return to a boil. Cover the pot and remove from the heat.</li>
+<li>Let the noodles set for 30 minutes, stirring every 10 minutes or so.</li>
+<li>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.</li>
+<li>Top with the remaining 4 tablespoons of butter, parsley, and salt and pepper to taste.</li>
+<li>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.</li>
+</ul>
+<h2 id="notes" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/amish-egg-noodles/#notes" aria-hidden="true"></a> Notes</h2>
+<p>We use 4.5 tsp of Better than Bouillon with 28oz water, replacing the broth and bouillon cube.<br>
+We also usually brown some canned chicken and add it at the same time as the butter and seasonings.</p>
+<p>Original recipe from <a href="https://www.bunsinmyoven.com/amish-egg-noodles/" target="_blank" rel="noopener">bunsinmyoven</a></p>
+<h2 id="nutrition-information" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/amish-egg-noodles/#nutrition-information" aria-hidden="true"></a> Nutrition Information</h2>
+<p>Makes 6 servings. Each serving:<br>
+<strong>Calories</strong> 328kcal (16%), <strong>Total Fat</strong> 14g (22%), Saturated Fat 7g (44%), Cholesterol 77mg (26%), <strong>Sodium</strong> 758mg (33%), <strong>Total Carbohydrates</strong> 41g (14%), Dietary Fiber 2g (8%), Sugar 1g (1%), <strong>Protein</strong> 9g (18%), <strong>Vitamin C</strong> 10.3mg (12%), <strong>Vitamin A</strong> 400IU (8%), <strong>Iron</strong> 1.5mg (8%), <strong>Calcium</strong> 41mg (4%), <strong>Potassium</strong> 266mg (8%)</p>
+
+
+
+ Link: Verissimo Monthly - May 2025 - by Binyamin Grobman
+
+ 2025-06-03T17:39:50Z
+ https://verissimo.substack.com/p/verissimo-monthly-may-2025
+ <div class="markdown"><p>The Unreliability of LLMs & What Lies Ahead</p></div>
+
+
+
+ Link: Keeping up appearances | deadSimpleTech
+
+ 2025-05-31T04:02:35Z
+ https://deadsimpletech.com/blog/keeping_up_appearances
+ <div class="markdown"><p>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.</p></div>
+
+
+
+ Recipe: Perfect Homemade Brownies
+
+ 2025-05-20T00:00:00Z
+ https://joshua.seigler.net/recipes/perfect-homemade-brownies/
+ <h2 id="ingredients" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/perfect-homemade-brownies/#ingredients" aria-hidden="true"></a> Ingredients</h2>
+<ul>
+<li>1 cup butter</li>
+<li>2 1/4 cups sugar</li>
+<li>4 large eggs</li>
+<li>1 1/4 cups cocoa powder</li>
+<li>1 teaspoon salt</li>
+<li>1 teaspoon baking powder</li>
+<li>1 teaspoon espresso powder (optional)</li>
+<li>1 tablespoon vanilla extract</li>
+<li>1 1/2 cups all-purpose flour</li>
+<li>2 cups semi-sweet chocolate chips</li>
+</ul>
+<h2 id="instructions" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/perfect-homemade-brownies/#instructions" aria-hidden="true"></a> Instructions</h2>
+<ol>
+<li>Pre-heat the oven to 350 degrees. Butter a 9×13 baking dish.</li>
+<li>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.</li>
+<li>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.</li>
+<li>Stir in the flour and chocolate chips until well combined.</li>
+<li>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.</li>
+</ol>
+<h2 id="notes" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/perfect-homemade-brownies/#notes" aria-hidden="true"></a> Notes</h2>
+<p>Original recipe from <a href="https://www.bunsinmyoven.com/good-ol-homemade-brownies/" target="_blank" rel="noopener">Buns In My Oven</a></p>
+<h2 id="nutrition-information" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/perfect-homemade-brownies/#nutrition-information" aria-hidden="true"></a> Nutrition Information</h2>
+<p>16 servings. Each serving: <strong>Calories</strong> 419kcal (21%) <strong>Carbohydrates</strong> 53g (18%) <strong>Protein</strong> 5g (10%) <strong>Fat</strong> 22g (34%) <strong>Saturated Fat</strong> 13g (81%) <strong>Cholesterol</strong> 78mg (26%) <strong>Sodium</strong> 268mg (12%) <strong>Potassium</strong> 290mg (8%) <strong>Fiber</strong> 4g (17%) <strong>Sugar</strong> 36g (40%) <strong>Vitamin A</strong> 435IU (9%) <strong>Calcium</strong> 46mg (5%) <strong>Iron</strong> 3.2mg (18%)</p>
+
+
+
+ Recipe: Pasta Rosatella
+
+ 2025-05-20T00:00:00Z
+ https://joshua.seigler.net/recipes/pasta-rosatella/
+ <h2 id="ingredients" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/pasta-rosatella/#ingredients" aria-hidden="true"></a> Ingredients</h2>
+<ul>
+<li>1lb any pasta</li>
+<li>2 cups (approximate) garlic & herb pasta sauce</li>
+<li>1½ cups milk</li>
+<li>2 tablespoons flour</li>
+<li>2 tablespoons oil</li>
+<li>Salt and pepper</li>
+<li>Grated Parmesan cheese</li>
+</ul>
+<h2 id="instructions" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/pasta-rosatella/#instructions" aria-hidden="true"></a> Instructions</h2>
+<ol>
+<li>Cook the pasta according to the package directions.</li>
+<li>Meanwhile in a saucepan, whisk together the oil and flour over medium heat to form a roux. Cook for 1–2 minutes until lightly golden.</li>
+<li>Slowly whisk in the milk to make a béchamel and continue stirring until thickened.</li>
+<li>Season with salt and pepper, and add cheese.</li>
+<li>Stir in the pasta sauce and let the mixture simmer on low.</li>
+<li>When the pasta is done cooking, drain it, then top with the sauce and extra cheese to serve.</li>
+</ol>
+<h2 id="notes" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/pasta-rosatella/#notes" aria-hidden="true"></a> Notes</h2>
+<p>The recipe works the same with almond milk and vegan mozarella replacing the existing dairy.</p>
+<p>Original recipe from <a href="https://www.tiktok.com/@dollartreedinners/video/7499238134434123051" target="_blank" rel="noopener">dollartreedinners</a></p>
+<h2 id="nutrition-information" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/pasta-rosatella/#nutrition-information" aria-hidden="true"></a> Nutrition Information</h2>
+<p>Makes 4 servings. Each serving:<br>
+<strong>Calories</strong> 626kcal (31%) <strong>Total Fat</strong> 14.1g (18%) <strong>Saturated Fat</strong> 4.4g (22%) <strong>Trans Fat</strong> 0.19g <strong>Cholesterol</strong> 18.1mg (6%) <strong>Sodium</strong> 980.9mg (41%) <strong>Total Carbohydrate</strong> 100g (36%) <strong>Dietary Fiber</strong> 4.8g (17%) <strong>Total Sugars</strong> 10.7g (21%) <strong>Protein</strong> 22.8g (46%) <strong>Vitamin C</strong> 2.6mg (3%) <strong>Vitamin D</strong> 1.2mcg (6%) <strong>Iron</strong> 4.8mg (27%) <strong>Calcium</strong> 242.6mg (19%) <strong>Potassium</strong> 642.7mg (14%) <strong>Phosphorus</strong> 381.7mg (31%)</p>
+
+
+
+ Recipe: Creamy Chicken Orzo
+
+ 2025-05-20T00:00:00Z
+ https://joshua.seigler.net/recipes/creamy-chicken-orzo/
+ <h2 id="ingredients" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/creamy-chicken-orzo/#ingredients" aria-hidden="true"></a> Ingredients</h2>
+<ul>
+<li>2 boneless skinless chicken breasts, cooked and diced</li>
+<li>8 ounces Orzo pasta</li>
+<li>2 celery stalks, finely diced</li>
+<li>2 carrots, finely diced</li>
+<li>1/2 yellow onion, finely diced</li>
+<li>5 tablespoons butter</li>
+<li>2 tablespoons olive oil</li>
+<li>2 cups chicken broth</li>
+<li>½ cup heavy whipping cream</li>
+<li>1 teaspoon chicken bouillon powder</li>
+<li>1/3 cup all purpose flour</li>
+</ul>
+<h2 id="instructions" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/creamy-chicken-orzo/#instructions" aria-hidden="true"></a> Instructions</h2>
+<ol>
+<li>Cook the Orzo per the package instructions.</li>
+<li>While that cooks, make a mirepoix:
+<ol>
+<li>In a large skillet over medium high heat add the butter and olive oil.</li>
+<li>Once the butter is melted add in the diced onion, carrots and celery.</li>
+<li>Allow the veggies to sauté for 4-5 minutes until they start to soften up.</li>
+</ol>
+</li>
+<li>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.</li>
+<li>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.</li>
+<li>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 & enjoy!</li>
+</ol>
+<h2 id="notes" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/creamy-chicken-orzo/#notes" aria-hidden="true"></a> Notes</h2>
+<p>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.</p>
+<p>Original recipe from <a href="https://cookingwithkatiecross.com/creamy-chicken-pot-pie-orzo/" target="_blank" rel="noopener">Cooking with Katie Cross</a></p>
+<h2 id="nutrition-information" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/creamy-chicken-orzo/#nutrition-information" aria-hidden="true"></a> Nutrition Information</h2>
+<p>Makes 5 servings, 1700g. Each 340g serving:<br>
+<strong>Calories</strong> 496kcal (25%), <strong>Total Fat</strong> 21g (32%), Saturated Fat 9g (45%), Trans Fat 0g, <strong>Cholesterol</strong> 102mg (34%), <strong>Sodium</strong> 504mg (21%), <strong>Total Carbohydrates</strong> 45g (15%), Dietary Fiber 3g (13%), Sugars 3g, <strong>Protein</strong> 30g (60%), <strong>Vitamin A</strong> 4646IU, <strong>Vitamin C</strong> 3mg, <strong>Calcium</strong> 78mg, <strong>Iron</strong> 2mg, <strong>Potassium</strong> 442mg</p>
+
+
+
+ Post: Tools of the trade
+
+ 2025-05-15T00:00:00Z
+ https://joshua.seigler.net/posts/tools-of-the-trade/
+ <p>Everyone has different tools that they find especially effective. Here are some I have found with a few words about why I like them.</p>
+<blockquote>
+<p>Update: I made a <a href="https://joshua.seigler.net/uses">/uses</a> page that lists these tools and many others I like.</p>
+</blockquote>
+<h3 id="mise-en-place" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/tools-of-the-trade/#mise-en-place" aria-hidden="true"></a> <a href="https://mise.jdx.dev/" target="_blank" rel="noopener">mise-en-place</a></h3>
+<p>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 <code>asdf</code>, <code>nvm</code>, <code>pyenv</code>, <code>venv</code>, <code>rbenv</code>, and many other tool-specific version managers. Supports an incredible number of tools thanks to compatibility with <code>asdf</code>.</p>
+<p>It also supports installing specific global tools, like <code>angular-cli</code> from <code>npm</code>, or <code>stack-pr</code> from <code>pipx</code>.</p>
+<h3 id="stack-pr" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/tools-of-the-trade/#stack-pr" aria-hidden="true"></a> <a href="https://github.com/modular/stack-pr" target="_blank" rel="noopener">stack-pr</a></h3>
+<p>Open source tool for <a href="https://www.stacking.dev/" target="_blank" rel="noopener">stacking PRs</a>.</p>
+<p>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 don’t need a custom CI flow or managed service for stacking to work - this CLI tool or one of the others at <a href="https://www.stacking.dev/" target="_blank" rel="noopener">stacking.dev</a> can take care of this.</p>
+<p>If you start using PR stacks your whole company will start copying you.</p>
+<h3 id="xc" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/tools-of-the-trade/#xc" aria-hidden="true"></a> <a href="https://xcfile.dev/" target="_blank" rel="noopener">xc</a></h3>
+<p>Markdown based task runner.</p>
+<p>Define tasks in code blocks in markdown, and call them from the CLI. Serves as both task definition and documentation.</p>
+<h3 id="pd2slack" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/tools-of-the-trade/#pd2slack" aria-hidden="true"></a> <a href="https://github.com/sidpremkumar/pd2slack" target="_blank" rel="noopener">pd2slack</a></h3>
+<p>Simple python script to update the members of a Slack group such as <code>@oncall</code> to match the active member(s) of a PagerDuty schedule. This replaces several expensive SAAS services.</p>
+<h3 id="syncthing" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/tools-of-the-trade/#syncthing" aria-hidden="true"></a> <a href="https://syncthing.net/" target="_blank" rel="noopener">SyncThing</a></h3>
+<p>P2P alternative to Dropbox, supports mobile and desktop. Synchronize folders of content across all my devices.</p>
+<h3 id="obsidian" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/tools-of-the-trade/#obsidian" aria-hidden="true"></a> <a href="https://obsidian.md/" target="_blank" rel="noopener">Obsidian</a></h3>
+<p>For notes and reference. Sync across devices with <code>syncthing</code>.</p>
+<h3 id="keepassxc" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/tools-of-the-trade/#keepassxc" aria-hidden="true"></a> <a href="https://keepassxc.org/" target="_blank" rel="noopener">KeePassXC</a></h3>
+<p>For passwords. Sync across devices with <code>syncthing</code>.</p>
+
+
+
+ Recipe: Spanish Style Rice
+
+ 2025-05-05T00:00:00Z
+ https://joshua.seigler.net/recipes/spanish-style-rice/
+ <h2 id="ingredients" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/spanish-style-rice/#ingredients" aria-hidden="true"></a> Ingredients</h2>
+<ul>
+<li>3 Tbsp neutral oil</li>
+<li>2 cups long grain white rice</li>
+<li>4 cups water</li>
+<li>8 oz tomato sauce</li>
+<li>2 Tbsp chicken or vegetable bouillon powder</li>
+<li>1.5 cups water</li>
+</ul>
+<h2 id="instructions" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/spanish-style-rice/#instructions" aria-hidden="true"></a> Instructions</h2>
+<ol>
+<li>Add oil to a large frying pan over medium-high heat.</li>
+<li>Add uncooked rice, stirring continually until rice is toasted.</li>
+<li>Stir in 4 cups water, tomato sauce, and bouillon.</li>
+<li>Return to boil and leave uncovered <strong>10 minutes</strong>.</li>
+<li>Stir in 1.5 cups water and return to a boil.</li>
+<li>Reduce heat to low and cover. Simmer <strong>10 minutes</strong>.</li>
+<li>Turn off heat and leave in place, covered for <strong>20 minutes</strong>.</li>
+</ol>
+<p>Enjoy!</p>
+<h2 id="notes" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/spanish-style-rice/#notes" aria-hidden="true"></a> Notes</h2>
+<p>Original recipe from <a href="https://www.tiktok.com/t/ZT2Qy1AtF/" target="_blank" rel="noopener">dollartreedinners</a></p>
+<h2 id="nutrition-information" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/spanish-style-rice/#nutrition-information" aria-hidden="true"></a> Nutrition Information</h2>
+<p>Makes 4 servings. Each serving: <strong>Calories</strong> 441kcal (22%), <strong>Total Fat</strong> 11.3g (17%), Saturated Fat 1.9g (10%), Trans Fat 0.1g, Cholesterol 1mg (0%), <strong>Sodium</strong> 56mg (2%), <strong>Total Carbohydrates</strong> 76g (25%), Dietary Fiber 2g (6%), Sugars 0g, <strong>Protein</strong> 7g, <strong>Vitamin A</strong> (1%), <strong>Vitamin C</strong> (9%), <strong>Calcium</strong> (7%), <strong>Iron</strong> (24%)</p>
+
+
+
+ Recipe: Luther Salad
+
+ 2025-05-05T00:00:00Z
+ https://joshua.seigler.net/recipes/luther-salad/
+ <h2 id="ingredients" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/luther-salad/#ingredients" aria-hidden="true"></a> Ingredients</h2>
+<ul>
+<li>1 lb tri-color rotini</li>
+<li>italian dressing</li>
+<li>extras
+<ul>
+<li>cubed low-moisture mozzarella</li>
+<li>frozen peas</li>
+<li>shredded chicken</li>
+</ul>
+</li>
+</ul>
+<h2 id="instructions" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/luther-salad/#instructions" aria-hidden="true"></a> Instructions</h2>
+<ol>
+<li>Cook rotini in well salted water according to box directions. While rotini cooks, prepare your extras.</li>
+<li>Drain pasta and rinse twice in cold water to remove starch and stop carryover cooking.</li>
+<li>In a large bowl combine rotini and extras. Add italian dressing, at least 8 oz. Mix and serve or refrigerate.</li>
+</ol>
+<h2 id="notes" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/luther-salad/#notes" aria-hidden="true"></a> Notes</h2>
+<p>At first we called this “worm salad” but this proved off-putting, and we needed a new name. We had recently learned about the <a href="https://en.wikipedia.org/wiki/Diet_of_Worms" target="_blank" rel="noopener">1521 Diet of Worms</a> where Martin Luther was summoned to defend or recant his beliefs, so we called it “Luther salad” instead.</p>
+<p>The base salad already covers elements of <a href="https://www.saltfatacidheat.com/" target="_blank" rel="noopener">salt, fat, acid, and heat</a>, so your extras are mostly for texture, leaving lots of room for variations:</p>
+<h3 id="vegan-%2F-healthy%3A" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/luther-salad/#vegan-%2F-healthy%3A" aria-hidden="true"></a> Vegan / healthy:</h3>
+<ul>
+<li>halved cherry tomatoes</li>
+<li>slivered sweet peppers</li>
+<li>paysanne cucumber</li>
+</ul>
+<h3 id="italian%3A" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/luther-salad/#italian%3A" aria-hidden="true"></a> Italian:</h3>
+<ul>
+<li>halved cherry tomatoes</li>
+<li>sliced black olives, drained</li>
+<li>cubed cheese</li>
+<li>chopped pepperoni</li>
+</ul>
+<h2 id="nutrition-information" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/luther-salad/#nutrition-information" aria-hidden="true"></a> Nutrition Information</h2>
+<p>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.</p>
+
+
+
+ Recipe: Corn Casserole
+
+ 2025-04-24T00:00:00Z
+ https://joshua.seigler.net/recipes/corn-casserole/
+ <h2 id="ingredients" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/corn-casserole/#ingredients" aria-hidden="true"></a> Ingredients</h2>
+<ul>
+<li>1 can of corn drained</li>
+<li>1 can of creamed corn</li>
+<li>1 stick melted butter 1/2 cup</li>
+<li>1 box of Jiffy Corn Muffin mix</li>
+<li>1 cup sour cream</li>
+</ul>
+<h2 id="instructions" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/corn-casserole/#instructions" aria-hidden="true"></a> Instructions</h2>
+<ol>
+<li>Preheat the oven to 350 degrees.</li>
+<li>In a bowl, mix all of the ingredients together in order, then pour into a greased 8"x8" baking pan.</li>
+<li>Cook uncovered for 45-50 minutes or until lightly browned.</li>
+</ol>
+<h2 id="notes" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/corn-casserole/#notes" aria-hidden="true"></a> Notes</h2>
+<p>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.</p>
+<p>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.</p>
+<h2 id="nutrition-information" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/corn-casserole/#nutrition-information" aria-hidden="true"></a> Nutrition Information</h2>
+<p>Makes 15.5 100g servings. Each serving: <strong>Calories</strong>: 167g (8%), <strong>Protein</strong>: 2.82g (5%), <strong>Total Fat</strong>: 9.35g (19%), Cholesterol: 31g, Saturated Fat: 5.2g, Trans Fat: 0.24g, <strong>Carbohydrates</strong>: 20g (8%), Dietary Fiber: 1.1g (4%), Sugars: 2.05g, <strong>Calcium</strong>: 36mg (4%), <strong>Iron</strong>: 0.6mg (3%), <strong>Potassium</strong>: 137mg (3%), <strong>Sodium</strong>: 346mg (23%)</p>
+
+
+
+ Post: Thinking machines
+
+ 2025-04-24T00:00:00Z
+ https://joshua.seigler.net/posts/thinking-machines/
+ <p>There’s an exchange early in the classic '80s movie <a href="https://www.themoviedb.org/movie/97-tron" target="_blank" rel="noopener">TRON</a>. Some scientists are talking shop:</p>
+<p><picture><source type="image/avif" srcset="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" sizes="auto"><img loading="lazy" decoding="async" src="https://joshua.seigler.net/posts/thinking-machines/DYlrbvNwH--128.jpeg" alt="Still from TRON, left to right Linda, Alan, and Gibbs, in conversation." width="1280" height="621" srcset="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" sizes="auto"></picture></p>
+<blockquote>
+<p><strong>ALAN:</strong> I tell ya, ever since he got that Master Control Program, system’s got more bugs than a bait store.</p>
+<p><strong>GIBBS:</strong> Ehh, you gotta expect some static. After all, computers are just machines, they can’t think…</p>
+<p><strong>ALAN:</strong> Programs will be thinking <em>soon</em>.</p>
+<p><strong>GIBBS:</strong> (wryly) Hahaha, won’t that be grand – <em>computers and the programs will start thinking, and the people will stop!</em></p>
+</blockquote>
+<p>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?</p>
+<h2 id="mom-is-always-right" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/thinking-machines/#mom-is-always-right" aria-hidden="true"></a> Mom is always right</h2>
+<p>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.</p>
+<p>All that to say, the work that LLM technology offers to relieve isn’t 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.</p>
+<h2 id="attention-must-be-paid" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/thinking-machines/#attention-must-be-paid" aria-hidden="true"></a> Attention must be paid</h2>
+<p>Simply put, an LLM is a document completion engine. You give it text, and it extends it. The result doesn’t 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 that’s not the point, it’s more of a happy accident.</p>
+<p>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 can’t know what it’s like to be a human.</p>
+<p>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. <span class="aside"><a href="https://archive.org/details/on-bullshit-by-harry-frankfurt" target="_blank" rel="noopener">On Bullshit</a>, <em>Harry Frankfurt</em></span> Untrustworthy.</p>
+<h2 id="don%E2%80%99t-create-the-torment-nexus" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/thinking-machines/#don%E2%80%99t-create-the-torment-nexus" aria-hidden="true"></a> Don’t create the torment nexus</h2>
+<p>LLMs clearly manifest a type of intelligence. Sure, it’s “just” some linear algebra and a ton of data. But it does exhibit a type of intelligence. One without empathy. <span class="aside"><a href="https://apnews.com/article/chatbot-ai-lawsuit-suicide-teen-artificial-intelligence-9d48adc572100822fdbc3c90d1456bd0" target="_blank" rel="noopener">AI chatbot pushed teen to kill himself, lawsuit alleges</a>, <em>AP News</em><br>
+<a href="https://www.brusselstimes.com/430098/belgian-man-commits-suicide-following-exchanges-with-chatgpt" target="_blank" rel="noopener">Belgian man dies by suicide following exchanges with chatbot</a>, <em>Brussels Times</em><br>
+<a href="https://www.rollingstone.com/culture/culture-features/ai-spiritual-delusions-destroying-human-relationships-1235330175/" target="_blank" rel="noopener">AI-Fueled Spiritual Delusions Are Destroying Human Relationships</a>, <em>Rolling Stone</em></span> Not being human, it <em>can’t</em> have empathy—and intelligence without empathy can be dangerous.</p>
+<p>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 Infocom’s success was built on the misuse of intellectual property, much as LLM companies have done <span class="aside"><a href="https://sites.usc.edu/iptls/2025/02/04/ai-copyright-and-the-law-the-ongoing-battle-over-intellectual-property-rights/" target="_blank" rel="noopener">AI, Copyright, and the Law: The Ongoing Battle Over Intellectual Property Rights </a>, <em>IP & Technology Law Society</em><br>
+<a href="https://hbr.org/2023/04/generative-ai-has-an-intellectual-property-problem" target="_blank" rel="noopener">Generative AI Has an Intellectual Property Problem</a>, <em>Harvard Business Review</em></span>.</p>
+<p>I don’t think I am wise enough to safely use a genie in a bottle. And I don’t want to outsource my creative efforts to an addictive, bullshitting alien intellect, even if it might save time and effort in the short term.</p>
+<p><picture><source type="image/avif" srcset="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" sizes="auto"><img loading="lazy" decoding="async" src="https://joshua.seigler.net/posts/thinking-machines/-IYuxB_Iur-128.jpeg" alt="End of line" width="1280" height="575" srcset="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" sizes="auto"></picture></p>
+
+
+
+ Recipe: Sloppy Joes
+
+ 2024-06-07T00:00:00Z
+ https://joshua.seigler.net/recipes/sloppy-joes/
+ <h2 id="ingredients" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/sloppy-joes/#ingredients" aria-hidden="true"></a> Ingredients</h2>
+<ul>
+<li>1 lb. hamburger</li>
+<li>1/2 teaspoon paprika</li>
+<li>1 teaspoon chili powder</li>
+<li>1 Tablespoon dry mustard</li>
+<li>1 Tablespoon parsley, chopped</li>
+<li>1 Tablespoon Worcestershire sauce</li>
+<li>2 Tablespoons brown sugar</li>
+<li>2 Tablespoons apple cider vinegar</li>
+<li>1/2 cup onion, diced</li>
+<li>1/2 cup Ketchup</li>
+<li>1 cup water</li>
+</ul>
+<h2 id="instructions" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/sloppy-joes/#instructions" aria-hidden="true"></a> Instructions</h2>
+<ol>
+<li>Brown beef with onion, draining fat.</li>
+<li>Add all remaining ingredients and bring to a boil.</li>
+<li>Simmer 20 minutes or until thickened, stirring occasionally.</li>
+<li>Refrigerate overnight, serve hot.</li>
+</ol>
+<h2 id="notes" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/sloppy-joes/#notes" aria-hidden="true"></a> Notes</h2>
+<p>If you don’t have onion you can substitute 1/2 tablespoon onion powder.<br>
+Recipe originally from Connie Henderson of Charlottesville, VA</p>
+<h2 id="nutrition-information" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/recipes/sloppy-joes/#nutrition-information" aria-hidden="true"></a> Nutrition Information</h2>
+<p>Makes 9.5 100g servings. Each serving: <strong>Calories</strong>: 135 kcal (6%), <strong>Fat</strong>: 7.43g (15%), Cholesterol: 32 mg, Saturated Fat: 2.738g, Trans Fat: 0.408g, <strong>Carbohydrates</strong>: 7.62g (3%), Fiber: 0.4g (2%), Sugars: 5.99g, <strong>Protein</strong>: 9.26g (17%), <strong>Vitamin C</strong>: 1.8mg (2%), <strong>Vitamin A</strong>: 253 IU 1(1%), <strong>Vitamin D</strong>: 1 IU (0%)</p>
+
+
+
+ Post: Site design updated
+
+ 2024-06-05T00:00:00Z
+ https://joshua.seigler.net/posts/site-design-updated/
+ <style>@import url('/fonts/ftaurebesh/ftaurebesh.css');</style>
+<p>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 <a href="https://pnpm.io/" target="_blank" rel="noopener">pnpm</a>, <a href="https://www.11ty.dev/" target="_blank" rel="noopener">11ty</a>, and <a href="https://mozilla.github.io/nunjucks/" target="_blank" rel="noopener">Nunjucks</a>. Content is still in <a href="https://daringfireball.net/projects/markdown/" target="_blank" rel="noopener">markdown</a>.</p>
+<p>One thing I’m proud of is a visual ping for footnotes.<sup class="footnote-ref"><a href="https://joshua.seigler.net/posts/site-design-updated/#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup> When you click a footnote<sup class="footnote-ref"><a href="https://joshua.seigler.net/posts/site-design-updated/#footnote2">[2]</a><a class="footnote-anchor" id="footnote-ref2"></a></sup> it briefly highlights the thing you jumped to.</p>
+<p>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. <span data-language="aurebesh">People who can read this are cool and I like them.</span></p>
+<p>I also finally made a section for recipes!</p>
+<blockquote>
+<p>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.</p>
+</blockquote>
+<blockquote>
+<p>June 2025 edit: I have continued to alter the design. Pray I don’t alter it any further.</p>
+</blockquote>
+<hr class="footnotes-sep">
+<section class="footnotes">
+<ol class="footnotes-list">
+<li id="footnote1" class="footnote-item"><p>It highlights when you click back, too. <a href="https://joshua.seigler.net/posts/site-design-updated/#footnote-ref1" class="footnote-backref">↩︎</a></p>
+</li>
+<li id="footnote2" class="footnote-item"><p>Hi. <a href="https://joshua.seigler.net/posts/site-design-updated/#footnote-ref2" class="footnote-backref">↩︎</a></p>
+</li>
+</ol>
+</section>
+
+
+
+ Post: Finally, a Coherent Worldview
+
+ 2023-07-14T00:00:00Z
+ https://joshua.seigler.net/posts/finally-a-coherent-worldview/
+ <p>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.</p>
+<p>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 don’t 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 <em>ran</em> to him while he was still far away!</p>
+<p>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! It’s 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 don’t understand it at first.</p>
+
+
+
+ Post: Embracing Mysticism
+
+ 2021-10-16T00:00:00Z
+ https://joshua.seigler.net/posts/embracing-mysticism/
+ <p>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.</p>
+<p>In mid-2020 Vin Armani (now Cyprian) started calling this change “The Dim Age”<sup class="footnote-ref"><a href="https://joshua.seigler.net/posts/embracing-mysticism/#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup>. 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.</p>
+<p>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 Pageau’s project <a href="https://thesymbolicworld.com/" target="_blank" rel="noopener">The Symbolic World</a>, which has some very accessible videos breaking down movies and other pop culture artifacts from a symbolic perspective <sup class="footnote-ref"><a href="https://joshua.seigler.net/posts/embracing-mysticism/#footnote2">[2]</a><a class="footnote-anchor" id="footnote-ref2"></a></sup>. These commentaries did not seem arbitrary or speculative, but pointed to cultural trends that I couldn’t un-see once I understood them. I binged a bunch more of his material, including eventually a book his brother Mattheiu wrote, <em>The Language of Creation: Cosmic Symbolism in Genesis</em><sup class="footnote-ref"><a href="https://joshua.seigler.net/posts/embracing-mysticism/#footnote3">[3]</a><a class="footnote-anchor" id="footnote-ref3"></a></sup>. Through this I discovered a side of reality I had been almost completely oblivious to, and what’s more, an aspect of my faith which had somehow completely passed me by.</p>
+<p>From there I started listening to the <a href="https://www.ancientfaith.com/podcasts/lordofspirits" target="_blank" rel="noopener">Lord of Spirits</a> podcast. I learned that commonplace, obvious understanding of existence as material <em>and spiritual</em> 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.</p>
+<p>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 didn’t 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 <em>wanting</em> more and more.</p>
+<p>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.</p>
+<hr class="footnotes-sep">
+<section class="footnotes">
+<ol class="footnotes-list">
+<li id="footnote1" class="footnote-item"><p><a href="https://freemanbeyondthewall.libsyn.com/episode-478" target="_blank" rel="noopener">Free Man Beyond The Wall episode 478: We’ve Entered The ‘Dim Age’</a> <a href="https://joshua.seigler.net/posts/embracing-mysticism/#footnote-ref1" class="footnote-backref">↩︎</a></p>
+</li>
+<li id="footnote2" class="footnote-item"><p><a href="https://thesymbolicworld.com/videos/symbolism-propaganda-in-popular-culture/" target="_blank" rel="noopener">Symbolism and Propaganda in Popular Culture</a>, <a href="https://thesymbolicworld.com/videos/the-fall-of-loki-into-the-multiverse/" target="_blank" rel="noopener">The Fall of Loki (Into the Multiverse)</a> <a href="https://joshua.seigler.net/posts/embracing-mysticism/#footnote-ref2" class="footnote-backref">↩︎</a></p>
+</li>
+<li id="footnote3" class="footnote-item"><p><a href="https://amzn.to/4iBOExr" target="_blank" rel="noopener">The Language of Creation: Cosmic Symbolism in Genesis: A Commentary</a>, ISBN 978-1981549337 <a href="https://joshua.seigler.net/posts/embracing-mysticism/#footnote-ref3" class="footnote-backref">↩︎</a></p>
+</li>
+</ol>
+</section>
+
+
+
+ Post: Needs-based communication
+
+ 2021-05-26T00:00:00Z
+ https://joshua.seigler.net/posts/needs-based-communication/
+ <p>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.</p>
+<h2 id="needs" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/needs-based-communication/#needs" aria-hidden="true"></a> Needs</h2>
+<p><strong>Needs</strong> 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):</p>
+<p><strong>Physical wellbeing</strong> - air, food, movement/exercise, rest/sleep, sexual expression, safety, shelter, touch, water<br>
+<strong>Honesty</strong> - authenticity, integrity, presence<br>
+<strong>Connection</strong> - 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<br>
+<strong>Play</strong> - joy, humor<br>
+<strong>Peace</strong> - beauty, communion, ease, equality, harmony, inspiration, order<br>
+<strong>Autonomy</strong> - choice, freedom, independence, space, spontaneity<br>
+<strong>Meaning</strong> - 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</p>
+<p>Everything <em>anyone</em> 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.</p>
+<h2 id="conflict" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/needs-based-communication/#conflict" aria-hidden="true"></a> Conflict</h2>
+<p><strong>Conflict</strong> happens when several peoples’ needs aren’t met. We get stuck in conflict when we mix up needs and strategies. Needs never conflict with each other, only strategies do.</p>
+<p>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:</p>
+<ol>
+<li>We suppress the need and move on, painfully leaving the problem unaddressed.</li>
+<li>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.</li>
+<li>We escalate, expanding the conflict in an attempt to win, at the other’s expense if necessary.</li>
+</ol>
+<p>These resolutions can happen despite our best intentions, as a result of not understanding what’s happening as we fight. A very common mistake is to confuse needs and strategies.</p>
+<h2 id="strategies" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/needs-based-communication/#strategies" aria-hidden="true"></a> Strategies</h2>
+<p><strong>Strategies</strong> are things we do to meet our needs. In contrast to needs, which are abstract and universal, strategies are personal, specific, and widely varied.</p>
+<p>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.</p>
+<p>Jumping into a conflict strategy-first is bound to cause problems if that strategy doesn’t meet others’ needs as well as your own. The way past conflict is for everyone involved to understand each others’ needs, and <em>then</em> work together to find a strategy to meet those needs.</p>
+<p>So, <strong>how do you figure out your own needs?</strong></p>
+<h2 id="feelings" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/needs-based-communication/#feelings" aria-hidden="true"></a> Feelings</h2>
+<p>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 <em>abandoned</em>, 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.</p>
+<p>The truth is that the same situation can affect different people in very different ways. This means that feelings must come from a person’s own response to things. In order to see your own feelings clearly, it is important to take ownership of them as <em>your</em> feelings rather than something caused by the world around you. I have found this to be very challenging, but also incredibly rewarding.</p>
+<p>CNVC provides an incomplete inventory of feelings:</p>
+<h3 id="feelings-when-needs-are-met" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/needs-based-communication/#feelings-when-needs-are-met" aria-hidden="true"></a> Feelings when needs are met</h3>
+<p><strong>Affectionate</strong> - compassionate, friendly, loving, open-hearted, sympathetic, tender, warm<br>
+<strong>Engaged</strong> - absorbed, alert, curious, engrossed, enchanted, entranced, fascinated, interested, intrigued, involved, spellbound, stimulated<br>
+<strong>Hopeful</strong> - expectant, encouraged, optimistic<br>
+<strong>Confident</strong> - empowered, open, proud, safe, secure<br>
+<strong>Excited</strong> - amazed, animated, ardent, aroused, astonished, dazzled, eager, energetic, enthusiastic, giddy, invigorated, lively, passionate, surprised, vibrant<br>
+<strong>Grateful</strong> - appreciative, moved, thankful, touched<br>
+<strong>Inspired</strong> - amazed, awed, wonder<br>
+<strong>Refreshed</strong> - enlivened, rejuvenated, renewed, rested, restored, revived</p>
+<h3 id="feelings-when-needs-are-not-met" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/needs-based-communication/#feelings-when-needs-are-not-met" aria-hidden="true"></a> Feelings when needs are not met</h3>
+<p><strong>Afraid</strong> - apprehensive, dread, foreboding, frightened, mistrustful, panicked, petrified, scared, suspicious, terrified, wary, worried<br>
+<strong>Annoyed</strong> - aggravated, dismayed, disgruntled, displeased, exasperated, frustrated, impatient, irritated, irked<br>
+<strong>Angry</strong> - enraged, furious, incensed, indignant, irate, livid, outraged, resentful<br>
+<strong>Aversion</strong> - animosity, appalled, contempt, disgusted, dislike, hate, horrified, hostile, repulsed<br>
+<strong>Confused</strong> - ambivalent, baffled, bewildered, dazed, hesitant, lost, mystified, perplexed, puzzled, torn<br>
+<strong>Disconnected</strong> - alienated, aloof, apathetic, bored, cold, detached, distant, distracted, indifferent, numb, removed, uninterested, withdrawn<br>
+<strong>Disquiet</strong> - agitated, alarmed, discombobulated, disconcerted, disturbed, perturbed, rattled, restless, shocked, startled, surprised, troubled, turbulent, turmoil, uncomfortable, uneasy, unnerved, unsettled, upset<br>
+<strong>Embarrassed</strong> - ashamed, chagrined, flustered, guilty, mortified, self-conscious<br>
+<strong>Fatigue</strong> - beat, burnt out, depleted, exhausted, lethargic, listless, sleepy, tired, weary, worn out<br>
+<strong>Pain</strong> - agony, anguished, bereaved, devastated, grief, heartbroken, hurt, lonely, miserable, regretful, remorseful<br>
+<strong>Sad</strong> - depressed, dejected, despair, despondent, disappointed, discouraged, disheartened, forlorn, gloomy, heavy-hearted, hopeless, melancholy, unhappy, wretched<br>
+<strong>Tense</strong> - anxious, cranky, distressed, distraught, edgy, fidgety, frazzled, irritable, jittery nervous, overwhelmed, restless, stressed out<br>
+<strong>Vulnerable</strong> - fragile, guarded, helpless, insecure, leery, reserved, sensitive, shaky<br>
+<strong>Yearning</strong> - envious, jealous, longing, nostalgic, pining, wistful</p>
+<h2 id="resolving-feelings-from-unmet-needs" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/needs-based-communication/#resolving-feelings-from-unmet-needs" aria-hidden="true"></a> Resolving feelings from unmet needs</h2>
+<p>Once you have an honest name for what you are feeling, think about what need sparked the feeling.</p>
+<p>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 won’t need the formula, and can accomplish the same thing more naturally.</p>
+<p>Here it is:</p>
+<blockquote>
+<p>When <em>[observation]</em>, I felt <em>[feeling]</em> because I was having a need for <em>[need]</em>. (possibly also a request:) Are you willing to <em>[action]</em>?</p>
+</blockquote>
+<p>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.</p>
+<p>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 <em>and</em> theirs.</p>
+<p>There is a (similarly clunky) pattern for discovering someone else’s 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:</p>
+<blockquote>
+<p>When you <em>[observation]</em> do you feel <em>[feeling]</em> because you are having a need for <em>[need]</em>? (possibly also:) Right now, would you like me to <em>[action]</em>?</p>
+</blockquote>
+<p>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.</p>
+<p>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 someone’s feelings and needs demonstrates that you are really interested in their problem.</p>
+<p>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.</p>
+<p>Some resources for exploring these ideas more:</p>
+<ul>
+<li><a href="http://www.therightword.info/" target="_blank" rel="noopener">The Right Words and Beyond</a></li>
+<li><a href="https://amzn.to/44cpIsV" target="_blank" rel="noopener">Nonviolent Communication: A Language of Life</a>, ISBN 189200528X</li>
+<li><a href="https://www.cnvc.org/" target="_blank" rel="noopener">The Center for Nonviolent Communication</a></li>
+</ul>
+
+
+
+ Post: The Trivium: A Tool for Learning Anything
+
+ 2021-04-03T00:00:00Z
+ https://joshua.seigler.net/posts/the-trivium-a-tool-for-learning-anything/
+ <p>Information today has become siloed. It’s 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 <em>Trivium</em>.</p>
+<p>The ancients considered the liberal arts to be composed of seven parts. First was a foundation called the <em>trivium</em>, composed of grammar, logic, and rhetoric. Following that was the <em>quadrivium</em>, 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.</p>
+<h2 id="grammar" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/the-trivium-a-tool-for-learning-anything/#grammar" aria-hidden="true"></a> Grammar</h2>
+<p>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.</p>
+<h2 id="logic" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/the-trivium-a-tool-for-learning-anything/#logic" aria-hidden="true"></a> Logic</h2>
+<p>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.</p>
+<h2 id="rhetoric" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/the-trivium-a-tool-for-learning-anything/#rhetoric" aria-hidden="true"></a> Rhetoric</h2>
+<p>Rhetoric is about acting wisely: the application of knowledge and understanding, put into correct action. It answers “how?”</p>
+<p>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.</p>
+<h2 id="resources" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/the-trivium-a-tool-for-learning-anything/#resources" aria-hidden="true"></a> Resources</h2>
+<ul>
+<li><a href="https://triviumbinder.blogspot.com/" target="_blank" rel="noopener">Trivium Binder Project</a></li>
+<li><a href="http://www.scribd.com/doc/59477946/Trivium-Method-of-Critical-Thinking-and-Creative-Problem-Solving" target="_blank" rel="noopener">Tragedy and Hope: Five page summary of the Trivium</a></li>
+<li><a href="https://www.scribd.com/document/33744483/Trivium-Method-of-Thinking-vs-Other-Methodologies" target="_blank" rel="noopener">Shadows of the trivium in narrow disciplines</a></li>
+</ul>
+
+
+
+ Post: Authority - Consent's Blind Spot
+
+ 2020-07-02T00:00:00Z
+ https://joshua.seigler.net/posts/authority-consents-blind-spot/
+ <blockquote>
+<p>2025 disclaimer: I haven’t thought through all these ideas in a while, but I probably would change some of this or soften/rephrase it.</p>
+</blockquote>
+<p>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.</p>
+<p>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.</p>
+<p>People respect consent in most of their face-to-face dealings with others. Violating someone’s 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.</p>
+<p>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.</p>
+<p>Here are some popular excuses for violating consent that you may have seen:</p>
+<blockquote>
+<p>I am actually helping you.</p>
+</blockquote>
+<blockquote>
+<p>You like some of the things I do, so you must accept this as well.</p>
+</blockquote>
+<blockquote>
+<p>Everyone else lets me do this.</p>
+</blockquote>
+<blockquote>
+<p>Everyone else said it was okay if I do this.</p>
+</blockquote>
+<blockquote>
+<p>I am doing this, but someone else is responsible for my actions.</p>
+</blockquote>
+<blockquote>
+<p>You agreed to this by being born here.</p>
+</blockquote>
+<blockquote>
+<p>I am allowed to do this.</p>
+</blockquote>
+<p>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.</p>
+<p>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.<br>
+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 another’s person, without regard for consent.</p>
+<p>One problem with authority is that all the people on earth are humans. There’s 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.</p>
+<p>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.</p>
+<p>You would think acting on someone in a way they don’t 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 else’s 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.</p>
+<h2 id="solutions" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/authority-consents-blind-spot/#solutions" aria-hidden="true"></a> Solutions</h2>
+<p>Once you have seen through this trick, what can you do?</p>
+<h3 id="look-for-ways-to-sidestep-authority-altogether." tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/authority-consents-blind-spot/#look-for-ways-to-sidestep-authority-altogether." aria-hidden="true"></a> Look for ways to sidestep authority altogether.</h3>
+<p>Since very few people accept <em>absolute</em> 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.</p>
+<ul>
+<li><a href="https://theconsciousresistance.com/wp-content/uploads/2020/01/How_to_Opt_Out_of_the_Technocratic_State.pdf" target="_blank" rel="noopener">How to Opt Out of the Technocratic State (PDF)</a> by Derrick Broze</li>
+<li><a href="http://www.kopubco.com/pdf/An_Agorist_Primer_by_SEK3.pdf" target="_blank" rel="noopener">An Agorist Primer (PDF)</a> by Samuel Edward Konkin III</li>
+<li><a href="https://www.seasteading.org/" target="_blank" rel="noopener">The Seasteading Institute</a></li>
+</ul>
+<h3 id="teach-other-people-how-to-see-these-tricks-more-clearly." tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/authority-consents-blind-spot/#teach-other-people-how-to-see-these-tricks-more-clearly." aria-hidden="true"></a> Teach other people how to see these tricks more clearly.</h3>
+<p>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.</p>
+<ul>
+<li><a href="https://www.youtube.com/playlist?list=PL4jzSARXHuuwhBfzGNYhSVE4gJ8zmRnTH" target="_blank" rel="noopener">Playlist: Thomasz Kaye Animations</a></li>
+<li><a href="https://fee.org/stories" target="_blank" rel="noopener">Foundation for Economic Education</a></li>
+</ul>
+<h3 id="promote-alternatives-that-respect-consent." tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/authority-consents-blind-spot/#promote-alternatives-that-respect-consent." aria-hidden="true"></a> Promote alternatives that respect consent.</h3>
+<p>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.</p>
+<ul>
+<li><a href="http://daviddfriedman.com/The_Machinery_of_Freedom_.pdf" target="_blank" rel="noopener">The Machinery of Freedom (PDF)</a> <a href="http://daviddfriedman.com/The_Machinery_of_Freedom.prc" target="_blank" rel="noopener">(Ebook)</a> <a href="https://www.youtube.com/watch?v=jTYkdEU_B4o" target="_blank" rel="noopener">(Video)</a> by David D Friedman</li>
+</ul>
+<h3 id="use-the-ceremonies-of-authority-against-itself." tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/authority-consents-blind-spot/#use-the-ceremonies-of-authority-against-itself." aria-hidden="true"></a> Use the ceremonies of authority against itself.</h3>
+<p>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 don’t be surprised if their encounter with power changes their values.</p>
+<ul>
+<li><a href="https://lp.org/" target="_blank" rel="noopener">Libertarian Party</a></li>
+</ul>
+<h3 id="surround-yourself-with-people-who-care-about-consent." tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/authority-consents-blind-spot/#surround-yourself-with-people-who-care-about-consent." aria-hidden="true"></a> Surround yourself with people who care about consent.</h3>
+<p>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.</p>
+<ul>
+<li><a href="https://www.fsp.org/" target="_blank" rel="noopener">Free State Project</a></li>
+</ul>
+<h2 id="additional-resources" tabindex="-1"><a class="header-anchor" href="https://joshua.seigler.net/posts/authority-consents-blind-spot/#additional-resources" aria-hidden="true"></a> Additional Resources</h2>
+<ul>
+<li><a href="https://spot.colorado.edu/~huemer/1.htm" target="_blank" rel="noopener">The Problem of Political Authority (Chapter 1)</a> <a href="https://amzn.to/2AyQxw0" target="_blank" rel="noopener">(Amazon)</a> by Michael Huemer</li>
+<li><a href="https://ia601208.us.archive.org/27/items/236222899TheMostDangerousSuperstitionLarkenRose2011/the-most-dangerous-superstition-larken-rose-20111.pdf" target="_blank" rel="noopener">The Most Dangerous Superstitition (PDF)</a> by Larken Rose</li>
+<li><a href="http://bastiat.org/en/the_law.html" target="_blank" rel="noopener">The Law</a> by Frédéric Bastiat</li>
+</ul>
+
+
+
diff --git a/assets/iiTNZHD9dc-1152-CpjjN2Ty.avif b/assets/iiTNZHD9dc-1152-CpjjN2Ty.avif
new file mode 100644
index 0000000..fb44c05
Binary files /dev/null and b/assets/iiTNZHD9dc-1152-CpjjN2Ty.avif differ
diff --git a/assets/iiTNZHD9dc-1152-DtN1aopi.jpeg b/assets/iiTNZHD9dc-1152-DtN1aopi.jpeg
new file mode 100644
index 0000000..9ac9d0f
Binary files /dev/null and b/assets/iiTNZHD9dc-1152-DtN1aopi.jpeg differ
diff --git a/assets/iiTNZHD9dc-1888-Br_kUL8X.avif b/assets/iiTNZHD9dc-1888-Br_kUL8X.avif
new file mode 100644
index 0000000..2701519
Binary files /dev/null and b/assets/iiTNZHD9dc-1888-Br_kUL8X.avif differ
diff --git a/assets/iiTNZHD9dc-1888-Dw0d5CWo.jpeg b/assets/iiTNZHD9dc-1888-Dw0d5CWo.jpeg
new file mode 100644
index 0000000..9d38948
Binary files /dev/null and b/assets/iiTNZHD9dc-1888-Dw0d5CWo.jpeg differ
diff --git a/assets/iiTNZHD9dc-384-V3w-O_tJ.jpeg b/assets/iiTNZHD9dc-384-V3w-O_tJ.jpeg
new file mode 100644
index 0000000..caf72ee
Binary files /dev/null and b/assets/iiTNZHD9dc-384-V3w-O_tJ.jpeg differ
diff --git a/assets/iiTNZHD9dc-384-VGZrEpdq.avif b/assets/iiTNZHD9dc-384-VGZrEpdq.avif
new file mode 100644
index 0000000..ca1425b
Binary files /dev/null and b/assets/iiTNZHD9dc-384-VGZrEpdq.avif differ
diff --git a/assets/index-CQAqVHSN.js b/assets/index-CQAqVHSN.js
new file mode 100644
index 0000000..d0ccc35
--- /dev/null
+++ b/assets/index-CQAqVHSN.js
@@ -0,0 +1,2 @@
+import"./main-Cn83fOYW.js";const qa="modulepreload",Va=function(hu){return"/"+hu},Yr={},Ka=function(D,O,Ru){let nu=Promise.resolve();if(O&&O.length>0){let K=function(U){return Promise.all(U.map(W=>Promise.resolve(W).then(p=>({status:"fulfilled",value:p}),p=>({status:"rejected",reason:p}))))};document.getElementsByTagName("link");const $=document.querySelector("meta[property=csp-nonce]"),X=($==null?void 0:$.nonce)||($==null?void 0:$.getAttribute("nonce"));nu=K(O.map(U=>{if(U=Va(U),U in Yr)return;Yr[U]=!0;const W=U.endsWith(".css"),p=W?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${U}"]${p}`))return;const B=document.createElement("link");if(B.rel=W?"stylesheet":qa,W||(B.as="script"),B.crossOrigin="",B.href=U,X&&B.setAttribute("nonce",X),document.head.appendChild(B),W)return new Promise((F,Q)=>{B.addEventListener("load",F),B.addEventListener("error",()=>Q(new Error(`Unable to preload CSS for ${U}`)))})}))}function V(K){const $=new Event("vite:preloadError",{cancelable:!0});if($.payload=K,window.dispatchEvent($),!$.defaultPrevented)throw K}return nu.then(K=>{for(const $ of K||[])$.status==="rejected"&&V($.reason);return D().catch(V)})};(()=>{var hu=Object.defineProperty,D=(u,e)=>{for(var t in e)hu(u,t,{get:e[t],enumerable:!0})};function O(){}function Ru(u){return u()}function nu(){return Object.create(null)}function V(u){u.forEach(Ru)}function K(u){return typeof u=="function"}function $(u,e){return u!=u?e==e:u!==e||u&&typeof u=="object"||typeof u=="function"}var X;function U(u,e){return X||(X=document.createElement("a")),X.href=e,u===X.href}function W(u){return Object.keys(u).length===0}function p(u,e){u.appendChild(e)}function B(u,e,t){u.insertBefore(e,t||null)}function F(u){u.parentNode&&u.parentNode.removeChild(u)}function Q(u,e){for(let t=0;tu.removeEventListener(e,t,r)}function f(u,e,t){t==null?u.removeAttribute(e):u.getAttribute(e)!==t&&u.setAttribute(e,t)}function Qr(u){return Array.from(u.childNodes)}function I(u,e){e=""+e,u.data!==e&&(u.data=e)}function xu(u,e){u.value=e??""}function Z(u,e,t){u.classList[t?"add":"remove"](e)}var us=class{constructor(u=!1){this.is_svg=!1,this.is_svg=u,this.e=this.n=null}c(u){this.h(u)}m(u,e,t=null){this.e||(this.is_svg?this.e=Xr(e.nodeName):this.e=T(e.nodeType===11?"TEMPLATE":e.nodeName),this.t=e.tagName!=="TEMPLATE"?e:e.content,this.c(u)),this.i(t)}h(u){this.e.innerHTML=u,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(u){for(let e=0;eu.indexOf(r)===-1?e.push(r):t.push(r)),t.forEach(r=>r()),su=e}var mu=new Set,eu;function _u(){eu={r:0,c:[],p:eu}}function Eu(){eu.r||V(eu.c),eu=eu.p}function z(u,e){u&&u.i&&(mu.delete(u),u.i(e))}function L(u,e,t,r){if(u&&u.o){if(mu.has(u))return;mu.add(u),eu.c.push(()=>{mu.delete(u),r&&(t&&u.d(1),r())}),u.o(e)}else r&&r()}function is(u,e){L(u,1,1,()=>{e.delete(u.key)})}function os(u,e,t,r,s,a,l,n,i,_,c,d){let C=u.length,E=a.length,m=C,o={};for(;m--;)o[u[m].key]=m;let A=[],g=new Map,R=new Map,S=[];for(m=E;m--;){let v=d(s,a,m),k=t(v),w=l.get(k);w?S.push(()=>w.p(v,e)):(w=_(k,v),w.c()),g.set(k,A[m]=w),k in o&&R.set(k,Math.abs(m-o[k]))}let y=new Set,H=new Set;function q(v){z(v,1),v.m(n,c),l.set(v.key,v),c=v.first,E--}for(;C&&E;){let v=A[E-1],k=u[C-1],w=v.key,G=k.key;v===k?(c=v.first,C--,E--):g.has(G)?!l.has(w)||y.has(w)?q(v):H.has(G)?C--:R.get(w)>R.get(G)?(H.add(w),q(v)):(y.add(G),C--):(i(k,l),C--)}for(;C--;){let v=u[C];g.has(v.key)||i(v,l)}for(;E;)q(A[E-1]);return V(S),A}function cs(u,e,t){let r=u.$$.props[e];r!==void 0&&(u.$$.bound[r]=t,t(u.$$.ctx[r]))}function Su(u){u&&u.c()}function fu(u,e,t,r){let{fragment:s,after_update:a}=u.$$;s&&s.m(e,t),r||Fu(()=>{let l=u.$$.on_mount.map(Ru).filter(K);u.$$.on_destroy?u.$$.on_destroy.push(...l):V(l),u.$$.on_mount=[]}),a.forEach(Fu)}function gu(u,e){let t=u.$$;t.fragment!==null&&(ns(t.after_update),V(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function _s(u,e){u.$$.dirty[0]===-1&&(ru.push(u),ss(),u.$$.dirty.fill(0)),u.$$.dirty[e/31|0]|=1<{let m=E.length?E[0]:C;return _.ctx&&s(_.ctx[d],_.ctx[d]=m)&&(!_.skip_bound&&_.bound[d]&&_.bound[d](m),c&&_s(u,d)),C}):[],_.update(),c=!0,V(_.before_update),_.fragment=r?r(_.ctx):!1,e.target){if(e.hydrate){let d=Qr(e.target);_.fragment&&_.fragment.l(d),d.forEach(F)}else _.fragment&&_.fragment.c();e.intro&&z(u.$$.fragment),fu(u,e.target,e.anchor,e.customElement),Nu()}ou(i)}var pu=class{$destroy(){gu(this,1),this.$destroy=O}$on(u,e){if(!K(e))return O;let t=this.$$.callbacks[u]||(this.$$.callbacks[u]=[]);return t.push(e),()=>{let r=t.indexOf(e);r!==-1&&t.splice(r,1)}}$set(u){this.$$set&&!W(u)&&(this.$$.skip_bound=!0,this.$$set(u),this.$$.skip_bound=!1)}};function P(u){let e=typeof u=="string"?u.charCodeAt(0):u;return e>=97&&e<=122||e>=65&&e<=90}function lu(u){let e=typeof u=="string"?u.charCodeAt(0):u;return e>=48&&e<=57}function Y(u){return P(u)||lu(u)}var Es=["art-lojban","cel-gaulish","no-bok","no-nyn","zh-guoyu","zh-hakka","zh-min","zh-min-nan","zh-xiang"],$u={"en-gb-oed":"en-GB-oxendict","i-ami":"ami","i-bnn":"bnn","i-default":null,"i-enochian":null,"i-hak":"hak","i-klingon":"tlh","i-lux":"lb","i-mingo":null,"i-navajo":"nv","i-pwn":"pwn","i-tao":"tao","i-tay":"tay","i-tsu":"tsu","sgn-be-fr":"sfb","sgn-be-nl":"vgt","sgn-ch-de":"sgg","art-lojban":"jbo","cel-gaulish":null,"no-bok":"nb","no-nyn":"nn","zh-guoyu":"cmn","zh-hakka":"hak","zh-min":null,"zh-min-nan":"nan","zh-xiang":"hsn"},ds={}.hasOwnProperty;function wu(u,e={}){let t=zu(),r=String(u),s=r.toLowerCase(),a=0;if(u==null)throw new Error("Expected string, got `"+u+"`");if(ds.call($u,s)){let n=$u[s];return(e.normalize===void 0||e.normalize===null||e.normalize)&&typeof n=="string"?wu(n):(t[Es.includes(s)?"regular":"irregular"]=r,t)}for(;P(s.charCodeAt(a))&&a<9;)a++;if(a>1&&a<9){if(t.language=r.slice(0,a),a<4){let n=0;for(;s.charCodeAt(a)===45&&P(s.charCodeAt(a+1))&&P(s.charCodeAt(a+2))&&P(s.charCodeAt(a+3))&&!P(s.charCodeAt(a+4));){if(n>2)return l(a,3,"Too many extended language subtags, expected at most 3 subtags");t.extendedLanguageSubtags.push(r.slice(a+1,a+4)),a+=4,n++}}for(s.charCodeAt(a)===45&&P(s.charCodeAt(a+1))&&P(s.charCodeAt(a+2))&&P(s.charCodeAt(a+3))&&P(s.charCodeAt(a+4))&&!P(s.charCodeAt(a+5))&&(t.script=r.slice(a+1,a+5),a+=5),s.charCodeAt(a)===45&&(P(s.charCodeAt(a+1))&&P(s.charCodeAt(a+2))&&!P(s.charCodeAt(a+3))?(t.region=r.slice(a+1,a+3),a+=3):lu(s.charCodeAt(a+1))&&lu(s.charCodeAt(a+2))&&lu(s.charCodeAt(a+3))&&!lu(s.charCodeAt(a+4))&&(t.region=r.slice(a+1,a+4),a+=4));s.charCodeAt(a)===45;){let n=a+1,i=n;for(;Y(s.charCodeAt(i));){if(i-n>7)return l(i,1,"Too long variant, expected at most 8 characters");i++}if(i-n>4||i-n>3&&lu(s.charCodeAt(n)))t.variants.push(r.slice(n,i)),a=i;else break}for(;s.charCodeAt(a)===45&&!(s.charCodeAt(a+1)===120||!Y(s.charCodeAt(a+1))||s.charCodeAt(a+2)!==45||!Y(s.charCodeAt(a+3)));){let n=a+2,i=0;for(;s.charCodeAt(n)===45&&Y(s.charCodeAt(n+1))&&Y(s.charCodeAt(n+2));){let _=n+1;for(n=_+2,i++;Y(s.charCodeAt(n));){if(n-_>7)return l(n,2,"Too long extension, expected at most 8 characters");n++}}if(!i)return l(n,4,"Empty extension, extensions must have at least 2 characters of content");t.extensions.push({singleton:r.charAt(a+1),extensions:r.slice(a+3,n).split("-")}),a=n}}else a=0;if(a===0&&s.charCodeAt(a)===120||s.charCodeAt(a)===45&&s.charCodeAt(a+1)===120){a=a?a+2:1;let n=a;for(;s.charCodeAt(n)===45&&Y(s.charCodeAt(n+1));){let i=a+1;for(n=i;Y(s.charCodeAt(n));){if(n-i>7)return l(n,5,"Too long private-use area, expected at most 8 characters");n++}t.privateuse.push(r.slice(a+1,n)),a=n}}if(a!==r.length)return l(a,6,"Found superfluous content after tag");return t;function l(n,i,_){return e.warning&&e.warning(_,i,n),e.forgiving?t:zu()}}function zu(){return{language:null,extendedLanguageSubtags:[],script:null,region:null,variants:[],extensions:[],privateuse:[],irregular:null,regular:null}}function ju(u,e,t){let r=u.slice();return r[8]=e[t][0],r[9]=e[t][1],r}function Cs(u){let e,t,r,s,a,l=u[0]&&Ou();return{c(){l&&l.c(),e=M(),t=T("div"),r=T("p"),r.textContent=`${u[3](30)}`,s=M(),a=T("p"),a.textContent=`${u[3](40)}`,f(r,"class","pagefind-ui__result-title pagefind-ui__loading svelte-j9e30"),f(a,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-j9e30"),f(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(n,i){l&&l.m(n,i),B(n,e,i),B(n,t,i),p(t,r),p(t,s),p(t,a)},p(n,i){n[0]?l||(l=Ou(),l.c(),l.m(e.parentNode,e)):l&&(l.d(1),l=null)},d(n){l&&l.d(n),n&&F(e),n&&F(t)}}}function hs(u){var m;let e,t,r,s,a=((m=u[1].meta)==null?void 0:m.title)+"",l,n,i,_,c=u[1].excerpt+"",d,C=u[0]&&Uu(u),E=u[2].length&&Pu(u);return{c(){var o;C&&C.c(),e=M(),t=T("div"),r=T("p"),s=T("a"),l=b(a),i=M(),_=T("p"),d=M(),E&&E.c(),f(s,"class","pagefind-ui__result-link svelte-j9e30"),f(s,"href",n=((o=u[1].meta)==null?void 0:o.url)||u[1].url),f(r,"class","pagefind-ui__result-title svelte-j9e30"),f(_,"class","pagefind-ui__result-excerpt svelte-j9e30"),f(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(o,A){C&&C.m(o,A),B(o,e,A),B(o,t,A),p(t,r),p(r,s),p(s,l),p(t,i),p(t,_),_.innerHTML=c,p(t,d),E&&E.m(t,null)},p(o,A){var g,R;o[0]?C?C.p(o,A):(C=Uu(o),C.c(),C.m(e.parentNode,e)):C&&(C.d(1),C=null),A&2&&a!==(a=((g=o[1].meta)==null?void 0:g.title)+"")&&I(l,a),A&2&&n!==(n=((R=o[1].meta)==null?void 0:R.url)||o[1].url)&&f(s,"href",n),A&2&&c!==(c=o[1].excerpt+"")&&(_.innerHTML=c),o[2].length?E?E.p(o,A):(E=Pu(o),E.c(),E.m(t,null)):E&&(E.d(1),E=null)},d(o){C&&C.d(o),o&&F(e),o&&F(t),E&&E.d()}}}function Ou(u){let e;return{c(){e=T("div"),f(e,"class","pagefind-ui__result-thumb pagefind-ui__loading svelte-j9e30")},m(t,r){B(t,e,r)},d(t){t&&F(e)}}}function Uu(u){let e,t=u[1].meta.image&&Iu(u);return{c(){e=T("div"),t&&t.c(),f(e,"class","pagefind-ui__result-thumb svelte-j9e30")},m(r,s){B(r,e,s),t&&t.m(e,null)},p(r,s){r[1].meta.image?t?t.p(r,s):(t=Iu(r),t.c(),t.m(e,null)):t&&(t.d(1),t=null)},d(r){r&&F(e),t&&t.d()}}}function Iu(u){let e,t,r;return{c(){var s,a,l;e=T("img"),f(e,"class","pagefind-ui__result-image svelte-j9e30"),U(e.src,t=(s=u[1].meta)==null?void 0:s.image)||f(e,"src",t),f(e,"alt",r=((a=u[1].meta)==null?void 0:a.image_alt)||((l=u[1].meta)==null?void 0:l.title))},m(s,a){B(s,e,a)},p(s,a){var l,n,i;a&2&&!U(e.src,t=(l=s[1].meta)==null?void 0:l.image)&&f(e,"src",t),a&2&&r!==(r=((n=s[1].meta)==null?void 0:n.image_alt)||((i=s[1].meta)==null?void 0:i.title))&&f(e,"alt",r)},d(s){s&&F(e)}}}function Pu(u){let e,t=u[2],r=[];for(let s=0;su.toLocaleUpperCase();function fs(u,e,t){let{show_images:r=!0}=e,{process_result:s=null}=e,{result:a={data:async()=>{}}}=e,l=["title","image","image_alt","url"],n,i=[],_=async d=>{t(1,n=await d.data()),t(1,n=(s==null?void 0:s(n))??n),t(2,i=Object.entries(n.meta).filter(([C])=>!l.includes(C)))},c=(d=30)=>". ".repeat(Math.floor(10+Math.random()*d));return u.$$set=d=>{"show_images"in d&&t(0,r=d.show_images),"process_result"in d&&t(4,s=d.process_result),"result"in d&&t(5,a=d.result)},u.$$.update=()=>{u.$$.dirty&32&&_(a)},[r,n,i,c,s,a]}var gs=class extends pu{constructor(u){super(),Au(this,u,fs,ms,$,{show_images:0,process_result:4,result:5})}},As=gs;function Vu(u,e,t){let r=u.slice();return r[11]=e[t][0],r[12]=e[t][1],r}function Ku(u,e,t){let r=u.slice();return r[15]=e[t],r}function ps(u){let e,t,r,s,a,l=u[0]&&Gu();return{c(){l&&l.c(),e=M(),t=T("div"),r=T("p"),r.textContent=`${u[5](30)}`,s=M(),a=T("p"),a.textContent=`${u[5](40)}`,f(r,"class","pagefind-ui__result-title pagefind-ui__loading svelte-4xnkmf"),f(a,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-4xnkmf"),f(t,"class","pagefind-ui__result-inner svelte-4xnkmf")},m(n,i){l&&l.m(n,i),B(n,e,i),B(n,t,i),p(t,r),p(t,s),p(t,a)},p(n,i){n[0]?l||(l=Gu(),l.c(),l.m(e.parentNode,e)):l&&(l.d(1),l=null)},d(n){l&&l.d(n),n&&F(e),n&&F(t)}}}function Rs(u){var A;let e,t,r,s,a=((A=u[1].meta)==null?void 0:A.title)+"",l,n,i,_,c,d=u[0]&&Ju(u),C=u[4]&&Zu(u),E=u[3],m=[];for(let g=0;gu.toLocaleUpperCase();function Ts(u,e,t){let{show_images:r=!0}=e,{process_result:s=null}=e,{result:a={data:async()=>{}}}=e,l=["title","image","image_alt","url"],n,i=[],_=[],c=!1,d=(m,o)=>{if(m.length<=o)return m;let A=[...m].sort((g,R)=>R.locations.length-g.locations.length).slice(0,3).map(g=>g.url);return m.filter(g=>A.includes(g.url))},C=async m=>{var o,A,g;t(1,n=await m.data()),t(1,n=(s==null?void 0:s(n))??n),t(2,i=Object.entries(n.meta).filter(([R])=>!l.includes(R))),Array.isArray(n.sub_results)&&(t(4,c=((A=(o=n.sub_results)==null?void 0:o[0])==null?void 0:A.url)===(((g=n.meta)==null?void 0:g.url)||n.url)),c?t(3,_=d(n.sub_results.slice(1),3)):t(3,_=d([...n.sub_results],3)))},E=(m=30)=>". ".repeat(Math.floor(10+Math.random()*m));return u.$$set=m=>{"show_images"in m&&t(0,r=m.show_images),"process_result"in m&&t(6,s=m.process_result),"result"in m&&t(7,a=m.result)},u.$$.update=()=>{u.$$.dirty&128&&C(a)},[r,n,i,_,c,E,s,a]}var Fs=class extends pu{constructor(u){super(),Au(this,u,Ts,Bs,$,{show_images:0,process_result:6,result:7})}},Ds=Fs;function ee(u,e,t){let r=u.slice();return r[10]=e[t][0],r[11]=e[t][1],r[12]=e,r[13]=t,r}function te(u,e,t){let r=u.slice();return r[14]=e[t][0],r[15]=e[t][1],r[16]=e,r[17]=t,r}function re(u){let e,t,r=u[4]("filters_label",u[5],u[6])+"",s,a,l=Object.entries(u[1]),n=[];for(let i=0;iu.toLocaleUpperCase(),ie=u=>u.toLowerCase();function vs(u,e,t){let{available_filters:r=null}=e,{show_empty_filters:s=!0}=e,{open_filters:a=[]}=e,{translate:l=()=>""}=e,{automatic_translations:n={}}=e,{translations:i={}}=e,{selected_filters:_={}}=e,c=!1,d=!1;function C(E,m){_[`${E}:${m}`]=this.checked,t(0,_)}return u.$$set=E=>{"available_filters"in E&&t(1,r=E.available_filters),"show_empty_filters"in E&&t(2,s=E.show_empty_filters),"open_filters"in E&&t(3,a=E.open_filters),"translate"in E&&t(4,l=E.translate),"automatic_translations"in E&&t(5,n=E.automatic_translations),"translations"in E&&t(6,i=E.translations),"selected_filters"in E&&t(0,_=E.selected_filters)},u.$$.update=()=>{var E;if(u.$$.dirty&258&&r&&!c){t(8,c=!0);let m=Object.entries(r||{});m.length===1&&((E=Object.entries(m[0][1]))==null?void 0:E.length)<=6&&t(7,d=!0)}},[_,r,s,a,l,n,i,d,c,C]}var Ms=class extends pu{constructor(u){super(),Au(this,u,vs,Ss,$,{available_filters:1,show_empty_filters:2,open_filters:3,translate:4,automatic_translations:5,translations:6,selected_filters:0})}},ks=Ms,oe={};D(oe,{comments:()=>_e,default:()=>bs,direction:()=>Ee,strings:()=>de,thanks_to:()=>ce});var ce="Jan Claasen ",_e="",Ee="ltr",de={placeholder:"Soek",clear_search:"Opruim",load_more:"Laai nog resultate",search_label:"Soek hierdie webwerf",filters_label:"Filters",zero_results:"Geen resultate vir [SEARCH_TERM]",many_results:"[COUNT] resultate vir [SEARCH_TERM]",one_result:"[COUNT] resultate vir [SEARCH_TERM]",alt_search:"Geen resultate vir [SEARCH_TERM]. Toon resultate vir [DIFFERENT_TERM] in plaas daarvan",search_suggestion:"Geen resultate vir [SEARCH_TERM]. Probeer eerder een van die volgende terme:",searching:"Soek vir [SEARCH_TERM]"},bs={thanks_to:ce,comments:_e,direction:Ee,strings:de},Ce={};D(Ce,{comments:()=>me,default:()=>Hs,direction:()=>fe,strings:()=>ge,thanks_to:()=>he});var he="Jermanuts",me="",fe="rtl",ge={placeholder:"بحث",clear_search:"امسح",load_more:"حمِّل المزيد من النتائج",search_label:"ابحث في هذا الموقع",filters_label:"تصفيات",zero_results:"لا توجد نتائج ل [SEARCH_TERM]",many_results:"[COUNT] نتائج ل [SEARCH_TERM]",one_result:"[COUNT] نتيجة ل [SEARCH_TERM]",alt_search:"لا توجد نتائج ل [SEARCH_TERM]. يعرض النتائج ل [DIFFERENT_TERM] بدلاً من ذلك",search_suggestion:"لا توجد نتائج ل [SEARCH_TERM]. جرب أحد عمليات البحث التالية:",searching:"يبحث عن [SEARCH_TERM]..."},Hs={thanks_to:he,comments:me,direction:fe,strings:ge},Ae={};D(Ae,{comments:()=>Re,default:()=>xs,direction:()=>Be,strings:()=>Te,thanks_to:()=>pe});var pe="Maruf Alom ",Re="",Be="ltr",Te={placeholder:"অনুসন্ধান করুন",clear_search:"মুছে ফেলুন",load_more:"আরো ফলাফল দেখুন",search_label:"এই ওয়েবসাইটে অনুসন্ধান করুন",filters_label:"ফিল্টার",zero_results:"[SEARCH_TERM] এর জন্য কিছু খুঁজে পাওয়া যায়নি",many_results:"[COUNT]-টি ফলাফল পাওয়া গিয়েছে [SEARCH_TERM] এর জন্য",one_result:"[COUNT]-টি ফলাফল পাওয়া গিয়েছে [SEARCH_TERM] এর জন্য",alt_search:"কোন কিছু খুঁজে পাওয়া যায়নি [SEARCH_TERM] এর জন্য. পরিবর্তে [DIFFERENT_TERM] এর জন্য দেখানো হচ্ছে",search_suggestion:"কোন কিছু খুঁজে পাওয়া যায়নি [SEARCH_TERM] এর বিষয়ে. নিন্মের বিষয়বস্তু খুঁজে দেখুন:",searching:"অনুসন্ধান চলছে [SEARCH_TERM]..."},xs={thanks_to:pe,comments:Re,direction:Be,strings:Te},Fe={};D(Fe,{comments:()=>Se,default:()=>ys,direction:()=>ve,strings:()=>Me,thanks_to:()=>De});var De="Pablo Villaverde ",Se="",ve="ltr",Me={placeholder:"Cerca",clear_search:"Netejar",load_more:"Veure més resultats",search_label:"Cerca en aquest lloc",filters_label:"Filtres",zero_results:"No es van trobar resultats per [SEARCH_TERM]",many_results:"[COUNT] resultats trobats per [SEARCH_TERM]",one_result:"[COUNT] resultat trobat per [SEARCH_TERM]",alt_search:"No es van trobar resultats per [SEARCH_TERM]. Mostrant al seu lloc resultats per [DIFFERENT_TERM]",search_suggestion:"No es van trobar resultats per [SEARCH_TERM]. Proveu una de les cerques següents:",searching:"Cercant [SEARCH_TERM]..."},ys={thanks_to:De,comments:Se,direction:ve,strings:Me},ke={};D(ke,{comments:()=>He,default:()=>Ns,direction:()=>xe,strings:()=>ye,thanks_to:()=>be});var be="Dalibor Hon ",He="",xe="ltr",ye={placeholder:"Hledat",clear_search:"Smazat",load_more:"Načíst další výsledky",search_label:"Prohledat tuto stránku",filters_label:"Filtry",zero_results:"Žádné výsledky pro [SEARCH_TERM]",many_results:"[COUNT] výsledků pro [SEARCH_TERM]",one_result:"[COUNT] výsledek pro [SEARCH_TERM]",alt_search:"Žádné výsledky pro [SEARCH_TERM]. Zobrazují se výsledky pro [DIFFERENT_TERM]",search_suggestion:"Žádné výsledky pro [SEARCH_TERM]. Související výsledky hledání:",searching:"Hledám [SEARCH_TERM]..."},Ns={thanks_to:be,comments:He,direction:xe,strings:ye},Ne={};D(Ne,{comments:()=>we,default:()=>$s,direction:()=>ze,strings:()=>je,thanks_to:()=>$e});var $e="Jonas Smedegaard ",we="",ze="ltr",je={placeholder:"Søg",clear_search:"Nulstil",load_more:"Indlæs flere resultater",search_label:"Søg på dette website",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Prøv et af disse søgeord i stedet:",searching:"Søger efter [SEARCH_TERM]..."},$s={thanks_to:$e,comments:we,direction:ze,strings:je},Oe={};D(Oe,{comments:()=>Ie,default:()=>ws,direction:()=>Pe,strings:()=>Le,thanks_to:()=>Ue});var Ue="Jan Claasen ",Ie="",Pe="ltr",Le={placeholder:"Suche",clear_search:"Löschen",load_more:"Mehr Ergebnisse laden",search_label:"Suche diese Seite",filters_label:"Filter",zero_results:"Keine Ergebnisse für [SEARCH_TERM]",many_results:"[COUNT] Ergebnisse für [SEARCH_TERM]",one_result:"[COUNT] Ergebnis für [SEARCH_TERM]",alt_search:"Keine Ergebnisse für [SEARCH_TERM]. Stattdessen werden Ergebnisse für [DIFFERENT_TERM] angezeigt",search_suggestion:"Keine Ergebnisse für [SEARCH_TERM]. Versuchen Sie eine der folgenden Suchen:",searching:"Suche für [SEARCH_TERM]"},ws={thanks_to:Ue,comments:Ie,direction:Pe,strings:Le},qe={};D(qe,{comments:()=>Ke,default:()=>zs,direction:()=>Ge,strings:()=>Je,thanks_to:()=>Ve});var Ve="Liam Bigelow ",Ke="",Ge="ltr",Je={placeholder:"Search",clear_search:"Clear",load_more:"Load more results",search_label:"Search this site",filters_label:"Filters",zero_results:"No results for [SEARCH_TERM]",many_results:"[COUNT] results for [SEARCH_TERM]",one_result:"[COUNT] result for [SEARCH_TERM]",alt_search:"No results for [SEARCH_TERM]. Showing results for [DIFFERENT_TERM] instead",search_suggestion:"No results for [SEARCH_TERM]. Try one of the following searches:",searching:"Searching for [SEARCH_TERM]..."},zs={thanks_to:Ve,comments:Ke,direction:Ge,strings:Je},We={};D(We,{comments:()=>Ye,default:()=>js,direction:()=>Xe,strings:()=>Qe,thanks_to:()=>Ze});var Ze="Pablo Villaverde ",Ye="",Xe="ltr",Qe={placeholder:"Buscar",clear_search:"Limpiar",load_more:"Ver más resultados",search_label:"Buscar en este sitio",filters_label:"Filtros",zero_results:"No se encontraron resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"No se encontraron resultados para [SEARCH_TERM]. Mostrando en su lugar resultados para [DIFFERENT_TERM]",search_suggestion:"No se encontraron resultados para [SEARCH_TERM]. Prueba una de las siguientes búsquedas:",searching:"Buscando [SEARCH_TERM]..."},js={thanks_to:Ze,comments:Ye,direction:Xe,strings:Qe},ut={};D(ut,{comments:()=>tt,default:()=>Os,direction:()=>rt,strings:()=>st,thanks_to:()=>et});var et="Ali Khaleqi Yekta ",tt="",rt="rtl",st={placeholder:"جستجو",clear_search:"پاکسازی",load_more:"بارگذاری نتایج بیشتر",search_label:"جستجو در سایت",filters_label:"فیلترها",zero_results:"نتیجهای برای [SEARCH_TERM] یافت نشد",many_results:"[COUNT] نتیجه برای [SEARCH_TERM] یافت شد",one_result:"[COUNT] نتیجه برای [SEARCH_TERM] یافت شد",alt_search:"نتیجهای برای [SEARCH_TERM] یافت نشد. در عوض نتایج برای [DIFFERENT_TERM] نمایش داده میشود",search_suggestion:"نتیجهای برای [SEARCH_TERM] یافت نشد. یکی از جستجوهای زیر را امتحان کنید:",searching:"در حال جستجوی [SEARCH_TERM]..."},Os={thanks_to:et,comments:tt,direction:rt,strings:st},at={};D(at,{comments:()=>nt,default:()=>Us,direction:()=>it,strings:()=>ot,thanks_to:()=>lt});var lt="Valtteri Laitinen ",nt="",it="ltr",ot={placeholder:"Haku",clear_search:"Tyhjennä",load_more:"Lataa lisää tuloksia",search_label:"Hae tältä sivustolta",filters_label:"Suodattimet",zero_results:"Ei tuloksia haulle [SEARCH_TERM]",many_results:"[COUNT] tulosta haulle [SEARCH_TERM]",one_result:"[COUNT] tulos haulle [SEARCH_TERM]",alt_search:"Ei tuloksia haulle [SEARCH_TERM]. Näytetään tulokset sen sijaan haulle [DIFFERENT_TERM]",search_suggestion:"Ei tuloksia haulle [SEARCH_TERM]. Kokeile jotain seuraavista:",searching:"Haetaan [SEARCH_TERM]..."},Us={thanks_to:lt,comments:nt,direction:it,strings:ot},ct={};D(ct,{comments:()=>Et,default:()=>Is,direction:()=>dt,strings:()=>Ct,thanks_to:()=>_t});var _t="Nicolas Friedli ",Et="",dt="ltr",Ct={placeholder:"Rechercher",clear_search:"Nettoyer",load_more:"Charger plus de résultats",search_label:"Recherche sur ce site",filters_label:"Filtres",zero_results:"Pas de résultat pour [SEARCH_TERM]",many_results:"[COUNT] résultats pour [SEARCH_TERM]",one_result:"[COUNT] résultat pour [SEARCH_TERM]",alt_search:"Pas de résultat pour [SEARCH_TERM]. Montre les résultats pour [DIFFERENT_TERM] à la place",search_suggestion:"Pas de résultat pour [SEARCH_TERM]. Essayer une des recherches suivantes:",searching:"Recherche [SEARCH_TERM]..."},Is={thanks_to:_t,comments:Et,direction:dt,strings:Ct},ht={};D(ht,{comments:()=>ft,default:()=>Ps,direction:()=>gt,strings:()=>At,thanks_to:()=>mt});var mt="Pablo Villaverde ",ft="",gt="ltr",At={placeholder:"Buscar",clear_search:"Limpar",load_more:"Ver máis resultados",search_label:"Buscar neste sitio",filters_label:"Filtros",zero_results:"Non se atoparon resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados atopados para [SEARCH_TERM]",one_result:"[COUNT] resultado atopado para [SEARCH_TERM]",alt_search:"Non se atoparon resultados para [SEARCH_TERM]. Amosando no seu lugar resultados para [DIFFERENT_TERM]",search_suggestion:"Non se atoparon resultados para [SEARCH_TERM]. Probe unha das seguintes pesquisas:",searching:"Buscando [SEARCH_TERM]..."},Ps={thanks_to:mt,comments:ft,direction:gt,strings:At},pt={};D(pt,{comments:()=>Bt,default:()=>Ls,direction:()=>Tt,strings:()=>Ft,thanks_to:()=>Rt});var Rt="Nir Tamir ",Bt="",Tt="rtl",Ft={placeholder:"חיפוש",clear_search:"ניקוי",load_more:"עוד תוצאות",search_label:"חיפוש באתר זה",filters_label:"מסננים",zero_results:"לא נמצאו תוצאות עבור [SEARCH_TERM]",many_results:"נמצאו [COUNT] תוצאות עבור [SEARCH_TERM]",one_result:"נמצאה תוצאה אחת עבור [SEARCH_TERM]",alt_search:"לא נמצאו תוצאות עבור [SEARCH_TERM]. מוצגות תוצאות עבור [DIFFERENT_TERM]",search_suggestion:"לא נמצאו תוצאות עבור [SEARCH_TERM]. נסו אחד מהחיפושים הבאים:",searching:"מחפש את [SEARCH_TERM]..."},Ls={thanks_to:Rt,comments:Bt,direction:Tt,strings:Ft},Dt={};D(Dt,{comments:()=>vt,default:()=>qs,direction:()=>Mt,strings:()=>kt,thanks_to:()=>St});var St="Amit Yadav ",vt="",Mt="ltr",kt={placeholder:"खोजें",clear_search:"साफ करें",load_more:"और अधिक परिणाम लोड करें",search_label:"इस साइट में खोजें",filters_label:"फ़िल्टर",zero_results:"कोई परिणाम [SEARCH_TERM] के लिए नहीं मिला",many_results:"[COUNT] परिणाम [SEARCH_TERM] के लिए मिले",one_result:"[COUNT] परिणाम [SEARCH_TERM] के लिए मिला",alt_search:"[SEARCH_TERM] के लिए कोई परिणाम नहीं मिला। इसके बजाय [DIFFERENT_TERM] के लिए परिणाम दिखा रहा है",search_suggestion:"[SEARCH_TERM] के लिए कोई परिणाम नहीं मिला। निम्नलिखित खोजों में से कोई एक आज़माएं:",searching:"[SEARCH_TERM] की खोज की जा रही है..."},qs={thanks_to:St,comments:vt,direction:Mt,strings:kt},bt={};D(bt,{comments:()=>xt,default:()=>Vs,direction:()=>yt,strings:()=>Nt,thanks_to:()=>Ht});var Ht="Diomed ",xt="",yt="ltr",Nt={placeholder:"Traži",clear_search:"Očisti",load_more:"Učitaj više rezultata",search_label:"Pretraži ovu stranicu",filters_label:"Filteri",zero_results:"Nema rezultata za [SEARCH_TERM]",many_results:"[COUNT] rezultata za [SEARCH_TERM]",one_result:"[COUNT] rezultat za [SEARCH_TERM]",alt_search:"Nema rezultata za [SEARCH_TERM]. Prikazujem rezultate za [DIFFERENT_TERM]",search_suggestion:"Nema rezultata za [SEARCH_TERM]. Pokušaj s jednom od ovih pretraga:",searching:"Pretražujem [SEARCH_TERM]..."},Vs={thanks_to:Ht,comments:xt,direction:yt,strings:Nt},$t={};D($t,{comments:()=>zt,default:()=>Ks,direction:()=>jt,strings:()=>Ot,thanks_to:()=>wt});var wt="Adam Laki ",zt="",jt="ltr",Ot={placeholder:"Keresés",clear_search:"Törlés",load_more:"További találatok betöltése",search_label:"Keresés az oldalon",filters_label:"Szűrés",zero_results:"Nincs találat a(z) [SEARCH_TERM] kifejezésre",many_results:"[COUNT] db találat a(z) [SEARCH_TERM] kifejezésre",one_result:"[COUNT] db találat a(z) [SEARCH_TERM] kifejezésre",alt_search:"Nincs találat a(z) [SEARCH_TERM] kifejezésre. Találatok mutatása inkább a(z) [DIFFERENT_TERM] kifejezésre",search_suggestion:"Nincs találat a(z) [SEARCH_TERM] kifejezésre. Próbáld meg a következő keresések egyikét:",searching:"Keresés a(z) [SEARCH_TERM] kifejezésre..."},Ks={thanks_to:wt,comments:zt,direction:jt,strings:Ot},Ut={};D(Ut,{comments:()=>Pt,default:()=>Gs,direction:()=>Lt,strings:()=>qt,thanks_to:()=>It});var It="Nixentric",Pt="",Lt="ltr",qt={placeholder:"Cari",clear_search:"Bersihkan",load_more:"Muat lebih banyak hasil",search_label:"Telusuri situs ini",filters_label:"Filter",zero_results:"[SEARCH_TERM] tidak ditemukan",many_results:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",one_result:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",alt_search:"[SEARCH_TERM] tidak ditemukan. Menampilkan hasil [DIFFERENT_TERM] sebagai gantinya",search_suggestion:"[SEARCH_TERM] tidak ditemukan. Coba salah satu pencarian berikut ini:",searching:"Mencari [SEARCH_TERM]..."},Gs={thanks_to:It,comments:Pt,direction:Lt,strings:qt},Vt={};D(Vt,{comments:()=>Gt,default:()=>Js,direction:()=>Jt,strings:()=>Wt,thanks_to:()=>Kt});var Kt="Cosette Bruhns Alonso, Andrew Janco ",Gt="",Jt="ltr",Wt={placeholder:"Cerca",clear_search:"Cancella la cronologia",load_more:"Mostra più risultati",search_label:"Cerca nel sito",filters_label:"Filtri di ricerca",zero_results:"Nessun risultato per [SEARCH_TERM]",many_results:"[COUNT] risultati per [SEARCH_TERM]",one_result:"[COUNT] risultato per [SEARCH_TERM]",alt_search:"Nessun risultato per [SEARCH_TERM]. Mostrando risultati per [DIFFERENT_TERM] come alternativa.",search_suggestion:"Nessun risultato per [SEARCH_TERM]. Prova una delle seguenti ricerche:",searching:"Cercando [SEARCH_TERM]..."},Js={thanks_to:Kt,comments:Gt,direction:Jt,strings:Wt},Zt={};D(Zt,{comments:()=>Xt,default:()=>Ws,direction:()=>Qt,strings:()=>u0,thanks_to:()=>Yt});var Yt="Tate",Xt="",Qt="ltr",u0={placeholder:"検索",clear_search:"クリア",load_more:"次を読み込む",search_label:"このサイトを検索",filters_label:"フィルタ",zero_results:"[SEARCH_TERM]の検索に一致する情報はありませんでした",many_results:"[SEARCH_TERM]の[COUNT]件の検索結果",one_result:"[SEARCH_TERM]の[COUNT]件の検索結果",alt_search:"[SEARCH_TERM]の検索に一致する情報はありませんでした。[DIFFERENT_TERM]の検索結果を表示しています",search_suggestion:"[SEARCH_TERM]の検索に一致する情報はありませんでした。次のいずれかの検索を試してください",searching:"[SEARCH_TERM]を検索しています"},Ws={thanks_to:Yt,comments:Xt,direction:Qt,strings:u0},e0={};D(e0,{comments:()=>r0,default:()=>Zs,direction:()=>s0,strings:()=>a0,thanks_to:()=>t0});var t0="Seokho Son ",r0="",s0="ltr",a0={placeholder:"검색어",clear_search:"비우기",load_more:"검색 결과 더 보기",search_label:"사이트 검색",filters_label:"필터",zero_results:"[SEARCH_TERM]에 대한 결과 없음",many_results:"[SEARCH_TERM]에 대한 결과 [COUNT]건",one_result:"[SEARCH_TERM]에 대한 결과 [COUNT]건",alt_search:"[SEARCH_TERM]에 대한 결과 없음. [DIFFERENT_TERM]에 대한 결과",search_suggestion:"[SEARCH_TERM]에 대한 결과 없음. 추천 검색어: ",searching:"[SEARCH_TERM] 검색 중..."},Zs={thanks_to:t0,comments:r0,direction:s0,strings:a0},l0={};D(l0,{comments:()=>i0,default:()=>Ys,direction:()=>o0,strings:()=>c0,thanks_to:()=>n0});var n0="",i0="",o0="ltr",c0={placeholder:"Rapu",clear_search:"Whakakore",load_more:"Whakauta ētahi otinga kē",search_label:"Rapu",filters_label:"Tātari",zero_results:"Otinga kore ki [SEARCH_TERM]",many_results:"[COUNT] otinga ki [SEARCH_TERM]",one_result:"[COUNT] otinga ki [SEARCH_TERM]",alt_search:"Otinga kore ki [SEARCH_TERM]. Otinga kē ki [DIFFERENT_TERM]",search_suggestion:"Otinga kore ki [SEARCH_TERM]. whakamātau ki ngā mea atu:",searching:"Rapu ki [SEARCH_TERM]..."},Ys={thanks_to:n0,comments:i0,direction:o0,strings:c0},_0={};D(_0,{comments:()=>d0,default:()=>Xs,direction:()=>C0,strings:()=>h0,thanks_to:()=>E0});var E0="Paul van Brouwershaven",d0="",C0="ltr",h0={placeholder:"Zoeken",clear_search:"Reset",load_more:"Meer resultaten laden",search_label:"Doorzoek deze site",filters_label:"Filters",zero_results:"Geen resultaten voor [SEARCH_TERM]",many_results:"[COUNT] resultaten voor [SEARCH_TERM]",one_result:"[COUNT] resultaat voor [SEARCH_TERM]",alt_search:"Geen resultaten voor [SEARCH_TERM]. In plaats daarvan worden resultaten voor [DIFFERENT_TERM] weergegeven",search_suggestion:"Geen resultaten voor [SEARCH_TERM]. Probeer een van de volgende zoekopdrachten:",searching:"Zoeken naar [SEARCH_TERM]..."},Xs={thanks_to:E0,comments:d0,direction:C0,strings:h0},m0={};D(m0,{comments:()=>g0,default:()=>Qs,direction:()=>A0,strings:()=>p0,thanks_to:()=>f0});var f0="Christopher Wingate",g0="",A0="ltr",p0={placeholder:"Søk",clear_search:"Fjern",load_more:"Last flere resultater",search_label:"Søk på denne siden",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Prøv en av disse søkeordene i stedet:",searching:"Søker etter [SEARCH_TERM]"},Qs={thanks_to:f0,comments:g0,direction:A0,strings:p0},R0={};D(R0,{comments:()=>T0,default:()=>ua,direction:()=>F0,strings:()=>D0,thanks_to:()=>B0});var B0="",T0="",F0="ltr",D0={placeholder:"Szukaj",clear_search:"Wyczyść",load_more:"Załaduj więcej",search_label:"Przeszukaj tę stronę",filters_label:"Filtry",zero_results:"Brak wyników dla [SEARCH_TERM]",many_results:"[COUNT] wyników dla [SEARCH_TERM]",one_result:"[COUNT] wynik dla [SEARCH_TERM]",alt_search:"Brak wyników dla [SEARCH_TERM]. Wyświetlam wyniki dla [DIFFERENT_TERM]",search_suggestion:"Brak wyników dla [SEARCH_TERM]. Pokrewne wyniki wyszukiwania:",searching:"Szukam [SEARCH_TERM]..."},ua={thanks_to:B0,comments:T0,direction:F0,strings:D0},S0={};D(S0,{comments:()=>M0,default:()=>ea,direction:()=>k0,strings:()=>b0,thanks_to:()=>v0});var v0="Jonatah",M0="",k0="ltr",b0={placeholder:"Pesquisar",clear_search:"Limpar",load_more:"Ver mais resultados",search_label:"Pesquisar",filters_label:"Filtros",zero_results:"Nenhum resultado encontrado para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"Nenhum resultado encontrado para [SEARCH_TERM]. Exibindo resultados para [DIFFERENT_TERM]",search_suggestion:"Nenhum resultado encontrado para [SEARCH_TERM]. Tente uma das seguintes pesquisas:",searching:"Pesquisando por [SEARCH_TERM]..."},ea={thanks_to:v0,comments:M0,direction:k0,strings:b0},H0={};D(H0,{comments:()=>y0,default:()=>ta,direction:()=>N0,strings:()=>$0,thanks_to:()=>x0});var x0="Bogdan Mateescu ",y0="",N0="ltr",$0={placeholder:"Căutare",clear_search:"Ştergeţi",load_more:"Încărcați mai multe rezultate",search_label:"Căutați în acest site",filters_label:"Filtre",zero_results:"Niciun rezultat pentru [SEARCH_TERM]",many_results:"[COUNT] rezultate pentru [SEARCH_TERM]",one_result:"[COUNT] rezultat pentru [SEARCH_TERM]",alt_search:"Niciun rezultat pentru [SEARCH_TERM]. Se afișează în schimb rezultatele pentru [DIFFERENT_TERM]",search_suggestion:"Niciun rezultat pentru [SEARCH_TERM]. Încercați una dintre următoarele căutări:",searching:"Se caută după: [SEARCH_TERM]..."},ta={thanks_to:x0,comments:y0,direction:N0,strings:$0},w0={};D(w0,{comments:()=>j0,default:()=>ra,direction:()=>O0,strings:()=>U0,thanks_to:()=>z0});var z0="Aleksandr Gordeev",j0="",O0="ltr",U0={placeholder:"Поиск",clear_search:"Очистить поле",load_more:"Загрузить еще",search_label:"Поиск по сайту",filters_label:"Фильтры",zero_results:"Ничего не найдено по запросу: [SEARCH_TERM]",many_results:"[COUNT] результатов по запросу: [SEARCH_TERM]",one_result:"[COUNT] результат по запросу: [SEARCH_TERM]",alt_search:"Ничего не найдено по запросу: [SEARCH_TERM]. Показаны результаты по запросу: [DIFFERENT_TERM]",search_suggestion:"Ничего не найдено по запросу: [SEARCH_TERM]. Попробуйте один из следующих вариантов",searching:"Поиск по запросу: [SEARCH_TERM]"},ra={thanks_to:z0,comments:j0,direction:O0,strings:U0},I0={};D(I0,{comments:()=>L0,default:()=>sa,direction:()=>q0,strings:()=>V0,thanks_to:()=>P0});var P0="Andrija Sagicc",L0="",q0="ltr",V0={placeholder:"Претрага",clear_search:"Брисање",load_more:"Приказ више резултата",search_label:"Претрага сајта",filters_label:"Филтери",zero_results:"Нема резултата за [SEARCH_TERM]",many_results:"[COUNT] резултата за [SEARCH_TERM]",one_result:"[COUNT] резултата за [SEARCH_TERM]",alt_search:"Нема резултата за [SEARCH_TERM]. Приказ додатник резултата за [DIFFERENT_TERM]",search_suggestion:"Нема резултата за [SEARCH_TERM]. Покушајте са неком од следећих претрага:",searching:"Претрага термина [SEARCH_TERM]..."},sa={thanks_to:P0,comments:L0,direction:q0,strings:V0},K0={};D(K0,{comments:()=>J0,default:()=>aa,direction:()=>W0,strings:()=>Z0,thanks_to:()=>G0});var G0="Montazar Al-Jaber ",J0="",W0="ltr",Z0={placeholder:"Sök",clear_search:"Rensa",load_more:"Visa fler träffar",search_label:"Sök på denna sida",filters_label:"Filter",zero_results:"[SEARCH_TERM] gav inga träffar",many_results:"[SEARCH_TERM] gav [COUNT] träffar",one_result:"[SEARCH_TERM] gav [COUNT] träff",alt_search:"[SEARCH_TERM] gav inga träffar. Visar resultat för [DIFFERENT_TERM] istället",search_suggestion:"[SEARCH_TERM] gav inga träffar. Försök igen med en av följande sökord:",searching:"Söker efter [SEARCH_TERM]..."},aa={thanks_to:G0,comments:J0,direction:W0,strings:Z0},Y0={};D(Y0,{comments:()=>Q0,default:()=>la,direction:()=>ur,strings:()=>er,thanks_to:()=>X0});var X0="Anonymous",Q0="",ur="ltr",er={placeholder:"Tafuta",clear_search:"Futa",load_more:"Pakia matokeo zaidi",search_label:"Tafuta tovuti hii",filters_label:"Vichujio",zero_results:"Hakuna matokeo ya [SEARCH_TERM]",many_results:"Matokeo [COUNT] ya [SEARCH_TERM]",one_result:"Tokeo [COUNT] la [SEARCH_TERM]",alt_search:"Hakuna mayokeo ya [SEARCH_TERM]. Badala yake, inaonyesha matokeo ya [DIFFERENT_TERM]",search_suggestion:"Hakuna matokeo ya [SEARCH_TERM]. Jaribu mojawapo ya utafutaji ufuatao:",searching:"Kutafuta [SEARCH_TERM]..."},la={thanks_to:X0,comments:Q0,direction:ur,strings:er},tr={};D(tr,{comments:()=>sr,default:()=>na,direction:()=>ar,strings:()=>lr,thanks_to:()=>rr});var rr="",sr="",ar="ltr",lr={placeholder:"தேடுக",clear_search:"அழிக்குக",load_more:"மேலும் முடிவுகளைக் காட்டுக",search_label:"இந்த தளத்தில் தேடுக",filters_label:"வடிகட்டல்கள்",zero_results:"[SEARCH_TERM] க்கான முடிவுகள் இல்லை",many_results:"[SEARCH_TERM] க்கான [COUNT] முடிவுகள்",one_result:"[SEARCH_TERM] க்கான முடிவு",alt_search:"[SEARCH_TERM] இத்தேடலுக்கான முடிவுகள் இல்லை, இந்த தேடல்களுக்கான ஒத்த முடிவுகள் [DIFFERENT_TERM]",search_suggestion:"[SEARCH_TERM] இத் தேடலுக்கான முடிவுகள் இல்லை.இதற்கு பதிலீடான தேடல்களை தேடுக:",searching:"[SEARCH_TERM] தேடப்படுகின்றது"},na={thanks_to:rr,comments:sr,direction:ar,strings:lr},nr={};D(nr,{comments:()=>or,default:()=>ia,direction:()=>cr,strings:()=>_r,thanks_to:()=>ir});var ir="Taylan Özgür Bildik",or="",cr="ltr",_r={placeholder:"Araştır",clear_search:"Temizle",load_more:"Daha fazla sonuç",search_label:"Site genelinde arama",filters_label:"Filtreler",zero_results:"[SEARCH_TERM] için sonuç yok",many_results:"[SEARCH_TERM] için [COUNT] sonuç bulundu",one_result:"[SEARCH_TERM] için [COUNT] sonuç bulundu",alt_search:"[SEARCH_TERM] için sonuç yok. Bunun yerine [DIFFERENT_TERM] için sonuçlar gösteriliyor",search_suggestion:"[SEARCH_TERM] için sonuç yok. Alternatif olarak aşağıdaki kelimelerden birini deneyebilirsiniz:",searching:"[SEARCH_TERM] araştırılıyor..."},ia={thanks_to:ir,comments:or,direction:cr,strings:_r},Er={};D(Er,{comments:()=>Cr,default:()=>oa,direction:()=>hr,strings:()=>mr,thanks_to:()=>dr});var dr="Vladyslav Lyshenko ",Cr="",hr="ltr",mr={placeholder:"Пошук",clear_search:"Очистити поле",load_more:"Завантажити ще",search_label:"Пошук по сайту",filters_label:"Фільтри",zero_results:"Нічого не знайдено за запитом: [SEARCH_TERM]",many_results:"[COUNT] результатів на запит: [SEARCH_TERM]",one_result:"[COUNT] результат за запитом: [SEARCH_TERM]",alt_search:"Нічого не знайдено на запит: [SEARCH_TERM]. Показано результати на запит: [DIFFERENT_TERM]",search_suggestion:"Нічого не знайдено на запит: [SEARCH_TERM]. Спробуйте один із таких варіантів",searching:"Пошук за запитом: [SEARCH_TERM]"},oa={thanks_to:dr,comments:Cr,direction:hr,strings:mr},fr={};D(fr,{comments:()=>Ar,default:()=>ca,direction:()=>pr,strings:()=>Rr,thanks_to:()=>gr});var gr="Long Nhat Nguyen",Ar="",pr="ltr",Rr={placeholder:"Tìm kiếm",clear_search:"Xóa",load_more:"Nhiều kết quả hơn",search_label:"Tìm kiếm trong trang này",filters_label:"Bộ lọc",zero_results:"Không tìm thấy kết quả cho [SEARCH_TERM]",many_results:"[COUNT] kết quả cho [SEARCH_TERM]",one_result:"[COUNT] kết quả cho [SEARCH_TERM]",alt_search:"Không tìm thấy kết quả cho [SEARCH_TERM]. Kiểm thị kết quả thay thế với [DIFFERENT_TERM]",search_suggestion:"Không tìm thấy kết quả cho [SEARCH_TERM]. Thử một trong các tìm kiếm:",searching:"Đang tìm kiếm cho [SEARCH_TERM]..."},ca={thanks_to:gr,comments:Ar,direction:pr,strings:Rr},Br={};D(Br,{comments:()=>Fr,default:()=>_a,direction:()=>Dr,strings:()=>Sr,thanks_to:()=>Tr});var Tr="Amber Song",Fr="",Dr="ltr",Sr={placeholder:"搜索",clear_search:"清除",load_more:"加载更多结果",search_label:"站内搜索",filters_label:"筛选",zero_results:"未找到 [SEARCH_TERM] 的相关结果",many_results:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",one_result:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",alt_search:"未找到 [SEARCH_TERM] 的相关结果。改为显示 [DIFFERENT_TERM] 的相关结果",search_suggestion:"未找到 [SEARCH_TERM] 的相关结果。请尝试以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},_a={thanks_to:Tr,comments:Fr,direction:Dr,strings:Sr},vr={};D(vr,{comments:()=>kr,default:()=>Ea,direction:()=>br,strings:()=>Hr,thanks_to:()=>Mr});var Mr="Amber Song",kr="",br="ltr",Hr={placeholder:"搜索",clear_search:"清除",load_more:"加載更多結果",search_label:"站內搜索",filters_label:"篩選",zero_results:"未找到 [SEARCH_TERM] 的相關結果",many_results:"找到 [COUNT] 個 [SEARCH_TERM] 的相關結果",one_result:"找到 [COUNT] 個 [SEARCH_TERM] 的相關結果",alt_search:"未找到 [SEARCH_TERM] 的相關結果。改為顯示 [DIFFERENT_TERM] 的相關結果",search_suggestion:"未找到 [SEARCH_TERM] 的相關結果。請嘗試以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},Ea={thanks_to:Mr,comments:kr,direction:br,strings:Hr},xr={};D(xr,{comments:()=>Nr,default:()=>da,direction:()=>$r,strings:()=>wr,thanks_to:()=>yr});var yr="Amber Song",Nr="",$r="ltr",wr={placeholder:"搜索",clear_search:"清除",load_more:"加载更多结果",search_label:"站内搜索",filters_label:"筛选",zero_results:"未找到 [SEARCH_TERM] 的相关结果",many_results:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",one_result:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",alt_search:"未找到 [SEARCH_TERM] 的相关结果。改为显示 [DIFFERENT_TERM] 的相关结果",search_suggestion:"未找到 [SEARCH_TERM] 的相关结果。请尝试以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},da={thanks_to:yr,comments:Nr,direction:$r,strings:wr},Ca=[oe,Ce,Ae,Fe,ke,Ne,Oe,qe,We,ut,at,ct,ht,pt,Dt,bt,$t,Ut,Vt,Zt,e0,l0,_0,m0,R0,S0,H0,w0,I0,K0,Y0,tr,nr,Er,fr,Br,vr,xr],ha=Ca,ma=["../../translations/af.json","../../translations/ar.json","../../translations/bn.json","../../translations/ca.json","../../translations/cs.json","../../translations/da.json","../../translations/de.json","../../translations/en.json","../../translations/es.json","../../translations/fa.json","../../translations/fi.json","../../translations/fr.json","../../translations/gl.json","../../translations/he.json","../../translations/hi.json","../../translations/hr.json","../../translations/hu.json","../../translations/id.json","../../translations/it.json","../../translations/ja.json","../../translations/ko.json","../../translations/mi.json","../../translations/nl.json","../../translations/no.json","../../translations/pl.json","../../translations/pt.json","../../translations/ro.json","../../translations/ru.json","../../translations/sr.json","../../translations/sv.json","../../translations/sw.json","../../translations/ta.json","../../translations/tr.json","../../translations/uk.json","../../translations/vi.json","../../translations/zh-cn.json","../../translations/zh-tw.json","../../translations/zh.json"];function zr(u,e,t){let r=u.slice();return r[51]=e[t],r}function jr(u){let e,t,r;function s(l){u[37](l)}let a={show_empty_filters:u[5],open_filters:u[6],available_filters:u[18],translate:u[20],automatic_translations:u[19],translations:u[7]};return u[0]!==void 0&&(a.selected_filters=u[0]),e=new ks({props:a}),cu.push(()=>cs(e,"selected_filters",s)),{c(){Su(e.$$.fragment)},m(l,n){fu(e,l,n),r=!0},p(l,n){let i={};n[0]&32&&(i.show_empty_filters=l[5]),n[0]&64&&(i.open_filters=l[6]),n[0]&262144&&(i.available_filters=l[18]),n[0]&524288&&(i.automatic_translations=l[19]),n[0]&128&&(i.translations=l[7]),!t&&n[0]&1&&(t=!0,i.selected_filters=l[0],as(()=>t=!1)),e.$set(i)},i(l){r||(z(e.$$.fragment,l),r=!0)},o(l){L(e.$$.fragment,l),r=!1},d(l){gu(e,l)}}}function Or(u){let e,t,r,s,a=[ga,fa],l=[];function n(i,_){return i[14]?0:1}return t=n(u),r=l[t]=a[t](u),{c(){e=T("div"),r.c(),f(e,"class","pagefind-ui__results-area svelte-e9gkc3")},m(i,_){B(i,e,_),l[t].m(e,null),s=!0},p(i,_){let c=t;t=n(i),t===c?l[t].p(i,_):(_u(),L(l[c],1,1,()=>{l[c]=null}),Eu(),r=l[t],r?r.p(i,_):(r=l[t]=a[t](i),r.c()),z(r,1),r.m(e,null))},i(i){s||(z(r),s=!0)},o(i){L(r),s=!1},d(i){i&&F(e),l[t].d()}}}function fa(u){let e,t,r,s=[],a=new Map,l,n,i;function _(o,A){return o[13].results.length===0?Ra:o[13].results.length===1?pa:Aa}let c=_(u),d=c(u),C=u[13].results.slice(0,u[17]),E=o=>o[51].id;for(let o=0;ou[17]&&Ir(u);return{c(){e=T("p"),d.c(),t=M(),r=T("ol");for(let o=0;oo[17]?m?m.p(o,A):(m=Ir(o),m.c(),m.m(n.parentNode,n)):m&&(m.d(1),m=null)},i(o){if(!i){for(let A=0;A{i[C]=null}),Eu(),s=i[r],s?s.p(e,d):(s=i[r]=n[r](e),s.c()),z(s,1),s.m(a.parentNode,a))},i(c){l||(z(s),l=!0)},o(c){L(s),l=!1},d(c){c&&F(t),i[r].d(c),c&&F(a)}}}function Ir(u){let e,t=u[20]("load_more",u[19],u[7])+"",r,s,a;return{c(){e=T("button"),r=b(t),f(e,"type","button"),f(e,"class","pagefind-ui__button svelte-e9gkc3")},m(l,n){B(l,e,n),p(e,r),s||(a=uu(e,"click",u[22]),s=!0)},p(l,n){n[0]&524416&&t!==(t=l[20]("load_more",l[19],l[7])+"")&&I(r,t)},d(l){l&&F(e),s=!1,a()}}}function Pr(u){let e,t=u[20]("searching",u[19],u[7]).replace(/\[SEARCH_TERM\]/,u[16])+"",r;return{c(){e=T("p"),r=b(t),f(e,"class","pagefind-ui__message svelte-e9gkc3")},m(s,a){B(s,e,a),p(e,r)},p(s,a){a[0]&589952&&t!==(t=s[20]("searching",s[19],s[7]).replace(/\[SEARCH_TERM\]/,s[16])+"")&&I(r,t)},d(s){s&&F(e)}}}function Fa(u){let e,t,r,s,a,l,n=u[20]("clear_search",u[19],u[7])+"",i,_,c,d,C,E,m,o,A=u[12]&&jr(u),g=u[15]&&Or(u);return{c(){e=T("div"),t=T("form"),r=T("input"),a=M(),l=T("button"),i=b(n),_=M(),c=T("div"),A&&A.c(),d=M(),g&&g.c(),f(r,"class","pagefind-ui__search-input svelte-e9gkc3"),f(r,"type","text"),f(r,"placeholder",s=u[20]("placeholder",u[19],u[7])),f(r,"autocapitalize","none"),f(r,"enterkeyhint","search"),r.autofocus=u[8],f(l,"class","pagefind-ui__search-clear svelte-e9gkc3"),Z(l,"pagefind-ui__suppressed",!u[9]),f(c,"class","pagefind-ui__drawer svelte-e9gkc3"),Z(c,"pagefind-ui__hidden",!u[15]),f(t,"class","pagefind-ui__form svelte-e9gkc3"),f(t,"role","search"),f(t,"aria-label",C=u[20]("search_label",u[19],u[7])),f(t,"action","javascript:void(0);"),f(e,"class","pagefind-ui svelte-e9gkc3"),Z(e,"pagefind-ui--reset",u[1])},m(R,S){B(R,e,S),p(e,t),p(t,r),xu(r,u[9]),u[34](r),p(t,a),p(t,l),p(l,i),u[35](l),p(t,_),p(t,c),A&&A.m(c,null),p(c,d),g&&g.m(c,null),E=!0,u[8]&&r.focus(),m||(o=[uu(r,"focus",u[21]),uu(r,"keydown",u[32]),uu(r,"input",u[33]),uu(l,"click",u[36]),uu(t,"submit",Da)],m=!0)},p(R,S){(!E||S[0]&524416&&s!==(s=R[20]("placeholder",R[19],R[7])))&&f(r,"placeholder",s),(!E||S[0]&256)&&(r.autofocus=R[8]),S[0]&512&&r.value!==R[9]&&xu(r,R[9]),(!E||S[0]&524416)&&n!==(n=R[20]("clear_search",R[19],R[7])+"")&&I(i,n),(!E||S[0]&512)&&Z(l,"pagefind-ui__suppressed",!R[9]),R[12]?A?(A.p(R,S),S[0]&4096&&z(A,1)):(A=jr(R),A.c(),z(A,1),A.m(c,d)):A&&(_u(),L(A,1,1,()=>{A=null}),Eu()),R[15]?g?(g.p(R,S),S[0]&32768&&z(g,1)):(g=Or(R),g.c(),z(g,1),g.m(c,null)):g&&(_u(),L(g,1,1,()=>{g=null}),Eu()),(!E||S[0]&32768)&&Z(c,"pagefind-ui__hidden",!R[15]),(!E||S[0]&524416&&C!==(C=R[20]("search_label",R[19],R[7])))&&f(t,"aria-label",C),(!E||S[0]&2)&&Z(e,"pagefind-ui--reset",R[1])},i(R){E||(z(A),z(g),E=!0)},o(R){L(A),L(g),E=!1},d(R){R&&F(e),u[34](null),u[35](null),A&&A.d(),g&&g.d(),m=!1,V(o)}}}var Da=u=>u.preventDefault();function Sa(u,e,t){let r={},s=ma.map(h=>h.match(/([^\/]+)\.json$/)[1]);for(let h=0;hx[h]??N[h]??"";es(()=>{var x,j,J;let h=((J=(j=(x=document==null?void 0:document.querySelector)==null?void 0:x.call(document,"html"))==null?void 0:j.getAttribute)==null?void 0:J.call(j,"lang"))||"en",N=wu(h.toLocaleLowerCase());t(19,Gr=r[`${N.language}-${N.script}-${N.region}`]||r[`${N.language}-${N.region}`]||r[`${N.language}`]||r.en)}),ts(()=>{var h;(h=k==null?void 0:k.destroy)==null||h.call(k),k=null});let Jr=async()=>{if(!Mu&&(t(12,Mu=!0),!k)){let h;try{h=await Ka(()=>import(`${a}pagefind.js`),[])}catch(x){console.error(x),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindUI"].join(`
+`)),document!=null&&document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?console.error(`[DEBUG: Loaded from ${document.currentScript.src??"bad script location"}]`):console.error("no known script location")}c||t(24,c=_?12:30);let N={...A||{},excerptLength:c};await h.options(N);for(let x of g){if(!x.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let j=x.bundlePath;delete x.bundlePath,await h.mergeIndex(j,x)}k=h,xa()}},xa=async()=>{k&&(Kr=await k.filters(),(!du||!Object.keys(du).length)&&t(18,du=Kr))},ya=h=>{let N={};return Object.entries(h).filter(([,x])=>x).forEach(([x])=>{let[j,J]=x.split(/:(.*)$/);N[j]=N[j]||[],N[j].push(J)}),N},Cu,Na=async(h,N)=>{if(!h){t(15,bu=!1),Cu&&clearTimeout(Cu);return}let x=ya(N),j=()=>$a(h,x);o>0&&h?(Cu&&clearTimeout(Cu),Cu=setTimeout(j,o),await Wr(),k.preload(h,{filters:x})):j(),wa()},Wr=async()=>{for(;!k;)Jr(),await new Promise(h=>setTimeout(h,50))},$a=async(h,N)=>{var Zr;t(16,Vr=h||""),typeof C=="function"&&(h=C(h)),t(14,ku=!0),t(15,bu=!0),await Wr();let x=++qr,j={filters:N};H&&typeof H=="object"&&(j.sort=H);let J=await k.search(h,j);qr===x&&(J.filters&&((Zr=Object.keys(J.filters))!=null&&Zr.length)&&t(18,du=J.filters),t(13,Lr=J),t(14,ku=!1),t(17,Hu=l))},wa=()=>{let h=G.offsetWidth;h!=ba&&t(10,w.style.paddingRight=`${h+2}px`,w)},za=h=>{h==null||h.preventDefault(),t(17,Hu+=l)},ja=h=>{h.key==="Escape"&&(t(9,v=""),w.blur()),h.key==="Enter"&&h.preventDefault()};function Oa(){v=this.value,t(9,v),t(23,R)}function Ua(h){cu[h?"unshift":"push"](()=>{w=h,t(10,w)})}function Ia(h){cu[h?"unshift":"push"](()=>{G=h,t(11,G)})}let Pa=()=>{t(9,v=""),w.blur()};function La(h){q=h,t(0,q)}return u.$$set=h=>{"base_path"in h&&t(25,a=h.base_path),"page_size"in h&&t(26,l=h.page_size),"reset_styles"in h&&t(1,n=h.reset_styles),"show_images"in h&&t(2,i=h.show_images),"show_sub_results"in h&&t(3,_=h.show_sub_results),"excerpt_length"in h&&t(24,c=h.excerpt_length),"process_result"in h&&t(4,d=h.process_result),"process_term"in h&&t(27,C=h.process_term),"show_empty_filters"in h&&t(5,E=h.show_empty_filters),"open_filters"in h&&t(6,m=h.open_filters),"debounce_timeout_ms"in h&&t(28,o=h.debounce_timeout_ms),"pagefind_options"in h&&t(29,A=h.pagefind_options),"merge_index"in h&&t(30,g=h.merge_index),"trigger_search_term"in h&&t(23,R=h.trigger_search_term),"translations"in h&&t(7,S=h.translations),"autofocus"in h&&t(8,y=h.autofocus),"sort"in h&&t(31,H=h.sort),"selected_filters"in h&&t(0,q=h.selected_filters)},u.$$.update=()=>{u.$$.dirty[0]&8388608&&R&&(t(9,v=R),t(23,R="")),u.$$.dirty[0]&513&&Na(v,q)},[q,n,i,_,d,E,m,S,y,v,w,G,Mu,Lr,ku,bu,Vr,Hu,du,Gr,Ha,Jr,za,R,c,a,l,C,o,A,g,H,ja,Oa,Ua,Ia,Pa,La]}var va=class extends pu{constructor(u){super(),Au(this,u,Sa,Fa,$,{base_path:25,page_size:26,reset_styles:1,show_images:2,show_sub_results:3,excerpt_length:24,process_result:4,process_term:27,show_empty_filters:5,open_filters:6,debounce_timeout_ms:28,pagefind_options:29,merge_index:30,trigger_search_term:23,translations:7,autofocus:8,sort:31,selected_filters:0},null,[-1,-1])}},Ma=va,vu;try{document!=null&&document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"&&(vu=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?ui.js.*$/)[1])}catch{vu="/pagefind/"}var ka=class{constructor(u){this._pfs=null;let e=u.element??"[data-pagefind-ui]",t=u.bundlePath??vu,r=u.pageSize??5,s=u.resetStyles??!0,a=u.showImages??!0,l=u.showSubResults??!1,n=u.excerptLength??0,i=u.processResult??null,_=u.processTerm??null,c=u.showEmptyFilters??!0,d=u.openFilters??[],C=u.debounceTimeoutMs??300,E=u.mergeIndex??[],m=u.translations??[],o=u.autofocus??!1,A=u.sort??null;delete u.element,delete u.bundlePath,delete u.pageSize,delete u.resetStyles,delete u.showImages,delete u.showSubResults,delete u.excerptLength,delete u.processResult,delete u.processTerm,delete u.showEmptyFilters,delete u.openFilters,delete u.debounceTimeoutMs,delete u.mergeIndex,delete u.translations,delete u.autofocus,delete u.sort;let g=e instanceof HTMLElement?e:document.querySelector(e);g?this._pfs=new Ma({target:g,props:{base_path:t,page_size:r,reset_styles:s,show_images:a,show_sub_results:l,excerpt_length:n,process_result:i,process_term:_,show_empty_filters:c,open_filters:d,debounce_timeout_ms:C,merge_index:E,translations:m,autofocus:o,sort:A,pagefind_options:u}}):console.error(`Pagefind UI couldn't find the selector ${e}`)}triggerSearch(u){this._pfs.$$set({trigger_search_term:u})}triggerFilters(u){let e={};for(let[t,r]of Object.entries(u))if(Array.isArray(r))for(let s of r)e[`${t}:${s}`]=!0;else e[`${t}:${r}`]=!0;this._pfs.$$set({selected_filters:e})}destroy(){this._pfs.$destroy()}};window.PagefindUI=ka})();
diff --git a/assets/main-BFsgSS42.css b/assets/main-BFsgSS42.css
new file mode 100644
index 0000000..3738bf2
--- /dev/null
+++ b/assets/main-BFsgSS42.css
@@ -0,0 +1 @@
+:root{font-size:16px;font-size:clamp(16px,10px + .75vw,30px);box-sizing:border-box;display:flex;flex-direction:column;min-height:100vh;flex-grow:1;padding:0;line-height:1.5;font-display:swap}body{--hue-main: 280;--c-highlight: oklch(45% .135 var(--hue-main) / .7);--c-accent: oklch(45% .135 var(--hue-main) / .8);--c-body-background: oklch(15% .05 var(--hue-main));--c-bg1: oklch(15% .05 calc(var(--hue-main) + 30));--c-bg2: oklch(15% .05 calc(var(--hue-main) - 30));--c-dark: oklch(19.1% .005 var(--hue-main));--c-text-background: oklch(45% .135 var(--hue-main) / .3);--c-text: oklch(94% .045 calc(var(--hue-main) + 180));--c-text-dim: oklch(94% .045 calc(var(--hue-main) + 180) / .67);--tag-luminance: .85;--glowColor: var(--c-accent);--ratio: 1.333;--s-5: calc(var(--s-4) / var(--ratio));--s-4: calc(var(--s-3) / var(--ratio));--s-3: calc(var(--s-2) / var(--ratio));--s-2: calc(var(--s-1) / var(--ratio));--s-1: calc(var(--s0) / var(--ratio));--s0: 1rem;--s1: calc(var(--s0) * var(--ratio));--s2: calc(var(--s1) * var(--ratio));--s3: calc(var(--s2) * var(--ratio));--s4: calc(var(--s3) * var(--ratio));--s5: calc(var(--s4) * var(--ratio));--content-width: clamp(75vw, 40rem, 100vw - 1rem);--sidebar-width: clamp( 10rem, calc(.2 * var(--content-width)), calc(var(--content-width) * .5) );--inset: calc(50vw - var(--content-width) / 2);position:relative;display:flex;flex-direction:column;z-index:1;flex-grow:1;padding:0;margin:0;font-family:Inter,Inter Variable,Ubuntu,Noto Sans,Fira Sans,Roboto,Helvetica Neue,Arial Nova,Nimbus Sans,Arial,sans-serif;background-color:var(--c-body-background);color:var(--c-text);background-image:image-set(url(/assets/noise-Bjd68H6B.avif) type("image/avif"),url(/assets/noise-9TQh8Crn.png) type("image/png")),radial-gradient(ellipse at -20% 20vmin,var(--c-bg1),transparent 90%),radial-gradient(ellipse at 120% calc(100% - 20vmin),var(--c-bg2),transparent 90%)}::selection{background:var(--c-highlight);color:var(--c-text)}*,:after,:before{box-sizing:inherit;font-family:inherit;text-decoration-color:color-mix(in srgb,currentColor 50%,transparent);text-decoration-thickness:.1rem}a,label{color:inherit;--c-accent: oklch(45% .135 var(--hue-main) / .8)}a[href]{-webkit-appearance:none;-moz-appearance:none;appearance:none;text-decoration-line:underline;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding:.1em;margin:-.1em;position:relative}@media screen{a[target=_blank]:after{display:inline-block;content:"";height:1em;width:1em;vertical-align:middle;background-color:currentColor;-webkit-mask-image:var(--icon-copy);mask-image:var(--icon-copy);opacity:.5}}a:hover,a:focus-visible{outline:none;color:var(--c-text);background-color:var(--glowColor);box-shadow:0 0 .5rem var(--glowColor),0 0 1rem var(--glowColor);text-decoration:none;border-radius:.5rem}a:hover img,a:focus-visible img{box-shadow:0 0 .5rem var(--glowColor),0 0 1rem var(--glowColor)}:is(a[href],button):focus-visible{z-index:1;outline:2px solid var(--c-text)}:root{--icon-copy: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3Csvg viewBox='-2 0 19 19' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14.267 3.793v7.996a.477.477 0 0 1-.475.475h-2.356v2.472a.476.476 0 0 1-.475.475H1.208a.476.476 0 0 1-.475-.475V6.74a.476.476 0 0 1 .475-.475h2.356V3.793a.476.476 0 0 1 .475-.475h9.753a.476.476 0 0 1 .475.475zm-3.94 8.471H4.04a.477.477 0 0 1-.475-.475V8.626H1.84v5.476h8.487zm2.832-6.585H4.672v5.476h8.487z'/%3E%3C/svg%3E");--icon-rss: url(/icons/rss.svg)}main p img{max-width:100%}:where(img[width]){width:auto}:where(img[width][height]){height:auto}section:nth-child(n+2){margin-top:1rem}header.toc{display:block;margin:0;font-size:var(--s-1)}header.toc ol{display:inline;margin:0;padding:0}header.toc li{display:inline;list-style:none}header.toc li:nth-child(n+2):before{content:" · "}.toc>ol:before{content:"Contents: "}.toc ol ol:before{content:"("}.toc ol ol:after{content:")"}:target{animation:ping 1s ease-out}:target,:target a{text-decoration-color:var(--c-accent)}.footnotes-sep{position:relative;z-index:-1;margin:4rem -1rem -4rem;height:4.1rem;border:none;background-image:radial-gradient(ellipse farthest-side at 50% 0%,var(--c-highlight),transparent);opacity:.5}@keyframes ping{0%{border-radius:50%;background-color:var(--c-accent);box-shadow:var(--c-accent) 0 0 1rem 4rem}to{border-radius:50%;background-color:transparent;box-shadow:transparent 0 0 0 0}to{border-radius:initial}}li::marker{color:color-mix(in srgb,currentcolor 50%,transparent)}aside{display:inline-block;margin-left:1ch}span.aside{float:right;clear:right;position:relative;width:var(--sidebar-width);padding:.5rem 0 .5rem 1rem;font-size:var(--s-1)}@media (min-width: 40rem){main:has(span.aside){padding-right:calc(var(--inset) + var(--sidebar-width))}span.aside{padding:0 0 0 1rem;margin-right:calc(-1 * var(--sidebar-width))}span.aside:after{content:"";pointer-events:none;position:absolute;top:-.5rem;left:.5rem;right:0;bottom:-.5rem;z-index:-1;opacity:.4;background:radial-gradient(ellipse farthest-side at 50% 0%,var(--c-highlight),transparent)}}ul,ol{padding-left:1.5rem}ul.collection{padding-left:0}ul.collection>li{list-style-type:none;position:relative}ul.collection>li:has(.collection-cover){padding-bottom:2lh}@media (min-width: 60rem){ul.collection>li:has(.collection-cover){padding-bottom:.5rem;padding-right:50%}ul.collection>li:has(.collection-cover) .collection-cover{left:50%;width:50%;-webkit-mask-image:linear-gradient(to right,transparent,white 20%);mask-image:linear-gradient(to right,transparent,white 20%)}}ul.collection>li .collection-cover{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;object-position:50% 30%;border-radius:.25rem;z-index:-1}@media print{ul.collection>li .collection-cover{opacity:.2}}@media screen{ul.collection>li{background-color:oklch(from var(--c-accent) calc(l*.4) calc(c*.33) h / .67);box-shadow:inset 0 0 2rem -1rem var(--c-accent);padding:.5rem;border-radius:.25rem}ul.collection>li a.collection-itemTitle{position:static}ul.collection>li a.collection-itemTitle:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0}}ul.collection>li>p{width:100%}ul.collection>li>p:before{content:none}@media screen{ul.collection>li>p{color:var(--c-text-dim)}}ul.collection>li+li{margin-top:1rem}p{margin:0}p+p,pre+p{margin-top:1lh}blockquote{position:relative;margin:1lh 0;padding:0 1em}blockquote:after{content:"";pointer-events:none;position:absolute;z-index:-1;top:-1lh;bottom:-1lh;left:-.1em;width:15rem;max-width:100%;background:radial-gradient(ellipse farthest-side at 0% 50%,var(--c-highlight),transparent);opacity:.5}sup{font-size:var(--s-1);margin-top:-.2em}body>header{color:var(--c-text);padding:0 var(--inset) 0;border-radius:.5rem .5rem 0 0;padding-top:env(safe-area-inset-top,0)}body>header>nav{margin:.5rem 0 3rem}.nav-categories{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5em;margin-right:auto}.nav-categories>a{white-space:nowrap;display:inline-block}.nav-row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:wrap;gap:.5rem;margin-bottom:.25rem}.nav-home{flex-grow:1;order:2}.nav-home,nav [aria-current]{font-weight:700}.nav-settings{display:flex;gap:.5em;flex-direction:row;justify-content:end;flex-wrap:wrap}.nav-toggles{display:flex;flex-direction:row;font-size:var(--s-1)}.cover{display:flex;position:relative;flex-direction:column;justify-content:end;min-height:20rem}.cover img{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;object-position:50% 40%;z-index:-1;-webkit-mask-image:linear-gradient(to bottom,white 8rem,transparent);mask-image:linear-gradient(to bottom,white 8rem,transparent);border-top-left-radius:1rem;border-top-right-radius:1rem}.cover>h1{padding:0 .5rem;margin-top:10rem}body>footer{position:relative;text-align:right;font-size:var(--s-1);margin:auto var(--inset) 0;padding-top:4rem;padding-bottom:max(env(safe-area-inset-bottom,0),.5rem)}body>footer a{white-space:nowrap}body>footer ul{padding:0;display:inline}body>footer ul>li{display:inline}body>footer ul>li+li:before{content:" · ";padding-inline:.5ch}.nav-toggle-button{position:relative;cursor:pointer;text-decoration-line:underline;display:inline-flex;align-items:center;border-radius:0;padding:.1rem .25rem;margin:0;border-radius:0!important;background-color:var(--c-text-background)}.nav-toggle-button>input[type=radio]{z-index:-2;position:absolute;top:0;right:0;bottom:0;left:0;opacity:0}.nav-toggle-button:first-of-type{border-top-left-radius:.5rem!important;border-bottom-left-radius:.5rem!important}.nav-toggle-button:last-of-type{border-top-right-radius:.5rem!important;border-bottom-right-radius:.5rem!important}h1,h2,h3,h4{color:color-mix(in lch,currentColor 90%,transparent);position:relative;font-weight:700;text-shadow:0 0 .5em var(--c-highlight);margin-top:3rem;line-height:1.1;margin-bottom:.5rem}h1+h1,h1+h2,h1+h3,h1+h4,h2+h1,h2+h2,h2+h3,h2+h4,h3+h1,h3+h2,h3+h3,h3+h4,h4+h1,h4+h2,h4+h3,h4+h4{margin-top:0}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor{opacity:1}@media screen{:is(h1,h2):after{pointer-events:none;opacity:.5;content:"";position:absolute;z-index:-1;bottom:0;left:-4rem;height:4em;width:30rem;max-width:100%;background:radial-gradient(ellipse farthest-side at 50% 100%,var(--c-highlight),transparent)}}h1{margin-bottom:0}a.rss{float:right;height:1lh;width:1lh;margin:0 0 0 .5rem;--glowColor: #F80A;background-image:var(--icon-rss);border-radius:.25em;opacity:.25;transition:5s opacity}a.rss:hover{opacity:1;transition:none}.header-meta{font-size:var(--s-1)}.header-meta>*+*:not(:empty):before{content:"-";padding:0 .5ch}.cover-info{color:var(--c-text-dim)}:where(ol li){list-style-type:decimal}:where(ol li) :where(ol li){list-style-type:lower-alpha}:where(ol li) :where(ol li) :where(ol li){list-style-type:upper-alpha}pre[class*=language-] button{display:none}@media screen{p:has(+pre[class*=language-])>code:first-child:last-child{position:relative;font-size:.8em}p:has(+pre[class*=language-])>code:after{content:"";pointer-events:none;opacity:.5;position:absolute;z-index:-1;bottom:0;left:-2rem;height:4rem;width:20rem;max-width:100%;background:radial-gradient(ellipse farthest-side at 50% 100%,var(--c-highlight),transparent)}pre[class*=language-] button{display:block;position:absolute;top:0;right:0;border-radius:.5rem;font-size:var(--s-1);padding:.25em}pre[class*=language-] button:before{content:"";display:flex;justify-content:center;align-items:center;width:1lh;height:1lh;background-color:currentColor;-webkit-mask-image:var(--icon-copy);mask-image:var(--icon-copy)}}main{margin-top:calc(.75 * var(--s3));padding:0 var(--inset)}main h1,main h2,main h3,main h4{clear:both;margin-bottom:.25lh}h1{font-size:var(--s4)}h2{font-size:var(--s3)}h3{font-size:var(--s2)}h4{font-size:var(--s1)}a.header-anchor{position:absolute;transform:translate(-100%);left:-.2ch;opacity:0;transition:opacity ease-in .1s}a.header-anchor:before{content:"#"}a.header-anchor:focus-visible{opacity:1}.item-summary{margin-bottom:1rem}:not(pre)>code,pre{font-family:Commit Mono,monospace;background-color:var(--c-text-background);padding:.1em;border-radius:.5em}p>code{margin:-.1em 0;display:inline-block}body #isso-thread{margin:4rem var(--inset) 0}body .isso-postbox{max-width:none}body .isso-textarea{margin:0;line-height:1.4rem}body h4.isso-thread-heading{color:inherit}body .isso-auth-section{display:flex;align-items:end;justify-content:end;gap:5px;margin-top:.5rem}body .isso-input-wrapper{display:flex;flex-direction:column;font-size:var(--s-1);margin:0;width:100%;max-width:none;flex-shrink:1}body .isso-input-wrapper label{height:auto}body .isso-input-wrapper input,input[type=text],body .isso-textarea,body .isso-preview{color:inherit;font-size:1rem;background-color:transparent;padding:.5rem;width:100%;border-radius:.2rem;line-height:1.4rem;border:none;border-bottom:2px solid var(--c-accent);box-shadow:inset 0 0 2rem -1rem var(--c-accent);outline:none}body .isso-input-wrapper input:focus,input[type=text]:focus,body .isso-textarea:focus,body .isso-preview:focus{box-shadow:inset 0 0 2rem -1rem var(--c-accent),inset 0 -1.5rem 2.5rem -1.5rem var(--c-accent);border-color:var(--c-accent)}body .isso-textarea{line-height:1.2}body .isso-preview{background:repeating-linear-gradient(-45deg,transparent,transparent 10px,var(--c-text-background) 10px,var(--c-text-background) 20px)}body .isso-post-action>input,button{color:inherit}body .isso-post-action>input,button,a.button{display:inline-block;text-decoration:none;background-color:var(--c-text-background);font-size:1rem;padding:.5rem;border-radius:.2rem;border:none;cursor:pointer;outline:0;line-height:1.4rem}body .isso-post-action>input:hover,body .isso-post-action>input:focus-visible,button:hover,button:focus-visible,a.button:hover,a.button:focus-visible{background-color:var(--c-accent);box-shadow:0 0 .5rem var(--c-accent),0 0 1rem var(--c-accent)}.button.tag{margin:0 .2em .2em 0}.tag{display:inline-block;position:relative;--tagLCH: var(--tag-luminance) .25 calc(300 + 137.508 * var(--tagIndex, 0));--glowColor: oklch(var(--tagLCH) / .3);--c-text-background: color-mix(in oklch, oklch(var(--tagLCH) / .4), #000A 50%);--c-accent: color-mix(in oklch, oklch(var(--tagLCH) / .8), #000A 50%);color:oklch(var(--tagLCH) / .8)}.tag:before{content:"#"}.tag:hover{color:var(--c-text)}.tag.button:has(.tagCount){padding-right:2em}.tag .tagCount{display:flex;align-items:center;position:absolute;overflow:hidden;top:0;right:0;bottom:0;line-height:0;font-size:3.3em;font-weight:700;padding-right:.1em;opacity:.175}body .isso-post-action{margin:0}.isso-postbox:not(.isso-preview-mode) .isso-post-action:has(input[name=edit]){display:none}@media (max-width: 60rem){body .isso-auth-section{flex-wrap:wrap}body .isso-input-wrapper{width:100%}}#effects{-webkit-mask-image:url(/code-traces.svg);mask-image:url(/code-traces.svg);pointer-events:none;position:absolute;z-index:-1;top:0;right:0;bottom:0;left:0;overflow:hidden}@keyframes ripple{0%{opacity:0;transform:scale(.2)}10%{opacity:.75}to{opacity:1;transform:scale(1.5)}}.effect-instance{position:absolute;border-radius:.5rem;background:radial-gradient(ellipse farthest-side at 50% 50%,var(--glowColor) 10%,color-mix(in lch,var(--glowColor),transparent) 25%,color-mix(in lch,var(--glowColor),transparent 80%) 35%,transparent);animation:1s ease normal forwards ripple}.pagefind-ui__form{display:grid;gap:.5rem;grid-template-columns:1fr min-content}.pagefind-ui__search-input{margin-right:.5rem;grid-column-start:0;grid-column-end:span 1}.pagefind-ui__drawer{grid-column-start:0;grid-column-end:span 2;width:100%}.pagefind-ui__result-excerpt{margin:.5rem 0}.feature>p:first-child:first-line{font-size:var(--s2);font-weight:200}mark{background:var(--c-highlight);color:inherit;border-radius:.4rem;box-shadow:0 0 .75em .25em var(--c-highlight)}@media print{:root{font-size:10pt}*{text-shadow:none!important}body{--c-highlight: white;--c-dark: white;--c-accent: black;--c-body-background: white;--c-text: black;--content-width: 100vw;--ratio: 1.2;background:none}h1,h2,h3,h4{opacity:.8;margin-top:1rem}main{margin-top:0}:is(h1,h2,h3,h4,blockquote,.aside):after{content:none!important}body>header>nav{display:none}body>footer{display:none}a[href^=http]:after{content:" (" attr(href) ")";font-size:.75em;word-break:break-all;font-family:Commit Mono,monospace}.footnotes :is(){display:block}.isso-postbox{display:none}.tag{background:none!important;color:inherit!important}.tag .tagCount{color:inherit;opacity:.25}.button{border:1px solid #aaa!important}}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;font-size:.8rem;line-height:1.4;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}:not(pre)>code[class*=language-]{background:var(--c-text-background-light);white-space:normal;border-radius:.2rem;padding:.1em}pre[class*=language-]{background:color-mix(in lch,var(--c-text-background-light) 20%,transparent);position:relative;margin:.5em 0;padding:.5em 1em .5em calc(var(--lineNumWidth) + .25rem);box-shadow:inset 0 0 6rem -2rem var(--c-highlight);counter-reset:lineNumber;--places: 1;--lineNumWidth: calc(1em + var(--places) * 1ch)}pre[class*=language-]>code{white-space:pre-wrap;word-break:break-all}pre[class*=language-]:has(.highlight-line:nth-child(10)){--places: 2 }pre[class*=language-]:has(.highlight-line:nth-child(100)){--places: 3 }pre[class*=language-]:has(.highlight-line:nth-child(1000)){--places: 4 }pre[class*=language-]:before{content:"";position:absolute;height:100%;top:0;left:var(--lineNumWidth);width:3rem;opacity:.125;z-index:-1;background:linear-gradient(to right,var(--c-highlight),transparent);border-radius:.5em}pre[class*=language-] .highlight-line{position:relative}pre[class*=language-] .highlight-line:before{content:counter(lineNumber);counter-increment:lineNumber;position:absolute;top:0;right:calc(100% + .5em);color:var(--c-highlight);word-break:normal}p:has(+pre[class*=language-])>code{margin:0;padding:.1em 1em;border-radius:none;background:none}p:has(>code)+pre[class*=language-]{margin-top:0}[class*=language-] .namespace{opacity:.7}.token.id,.token.important{font-weight:700}@media screen{pre[class*=language-]{color:var(--c-text-dim)}.language-css>code,.language-sass>code,.language-scss>code{color:#fd9170}.token.atrule{color:#c792ea}.token.attr-name{color:#ffcb6b}.token.attr-value,.token.attribute{color:#a5e844}.token.boolean{color:#c792ea}.token.builtin{color:#ffcb6b}.token.cdata,.token.char{color:#80cbc4}.token.class{color:#ffcb6b}.token.class-name{color:#f2ff00}.token.comment{color:#616161}.token.constant{color:#c792ea}.token.deleted{color:#f66}.token.doctype{color:#616161}.token.entity{color:#f66}.token.function{color:#c792ea}.token.hexcode{color:#f2ff00}.token.id,.token.important{color:#c792ea}.token.inserted{color:#80cbc4}.token.keyword{color:#c792ea}.token.number{color:#fd9170}.token.operator{color:#89ddff}.token.prolog{color:#616161}.token.property{color:#80cbc4}.token.pseudo-class,.token.pseudo-element{color:#a5e844}.token.punctuation{color:#89ddff}.token.regex{color:#f2ff00}.token.selector{color:#f66}.token.string{color:#a5e844}.token.symbol{color:#c792ea}.token.tag{color:#f66}.token.unit{color:#fd9170}.token.url,.token.variable{color:#f66}}
diff --git a/assets/main-Cn83fOYW.js b/assets/main-Cn83fOYW.js
new file mode 100644
index 0000000..c0c9237
--- /dev/null
+++ b/assets/main-Cn83fOYW.js
@@ -0,0 +1 @@
+(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))i(e);new MutationObserver(e=>{for(const t of e)if(t.type==="childList")for(const s of t.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&i(s)}).observe(document,{childList:!0,subtree:!0});function n(e){const t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?t.credentials="include":e.crossOrigin==="anonymous"?t.credentials="omit":t.credentials="same-origin",t}function i(e){if(e.ep)return;e.ep=!0;const t=n(e);fetch(e.href,t)}})();function d(r){const{target:o}=r,n=document.querySelector("#effects");if(n==null)return;Array.from(n.children).filter(e=>e.__effectParent===o?!0:l(r)&&Array.from(r.changedTouches).some(t=>t.identifier===e.__effectTouch)).forEach(e=>{e.getAnimations().forEach(t=>{if(+(t.currentTime??0)<100){t.pause(),n.removeChild(e);return}t.pause(),t.updatePlaybackRate(-.25),t.play(),t.addEventListener("finish",()=>{n.contains(e)&&n.removeChild(e)})})})}function f(r){return r!==null&&typeof r.matches=="function"}function l(r){return r.type.startsWith("touch")}function a(r){const{target:o}=r,n=document.querySelector("#effects"),i=window.getComputedStyle(f(o)?o:document.body).getPropertyValue("--glowColor");let e=[];if(l(r))e=Array.from(r.targetTouches).map(t=>({top:t.clientY-5,left:t.clientX-5,width:10,height:10}));else{if(!f(o)||!o.matches("a[href],.nav-toggle-button,button,input[type='radio']"))return;e=Array.from(o.getClientRects()),Array.from(o.children).forEach(t=>{e.push(...Array.from(t.getClientRects()))})}e.forEach(t=>{var m;const{top:s,left:h,width:p,height:y}=t,c=document.createElement("div");l(r)?c.__effectTouch=(m=r.targetTouches.item(0))==null?void 0:m.identifier:c.__effectParent=o,c.classList.add("effect-instance");const u="10rem";c.style.top=`calc(${s+window.scrollY}px - ${u})`,c.style.left=`calc(${h+window.scrollX}px - ${u})`,c.style.width=`calc(${p}px + 2 * ${u})`,c.style.height=`calc(${y}px + 2 * ${u})`,c.style.setProperty("--glowColor",i),n==null||n.appendChild(c)})}function g(){document.querySelectorAll("pre[class^=language]").forEach(r=>{const o=document.createElement("button");o.classList.add("copy-button"),o.addEventListener("click",()=>{r instanceof HTMLElement&&navigator.clipboard.writeText(r.innerText)}),r.appendChild(o)})}function E({target:r}){!f(r)||!r.matches("a[href][target=_blank]")||umami==null||umami.track(`Link: ${r.innerText??r.getAttribute("href")}`,{from:document.location.href,destination:r.getAttribute("href")})}document.addEventListener("mouseenter",a,!0);document.addEventListener("focus",a,!0);document.addEventListener("touchstart",a,!0);document.addEventListener("mouseleave",d,!0);document.addEventListener("blur",d,!0);document.addEventListener("touchend",d,!0);document.addEventListener("touchcancel",d,!0);document.addEventListener("click",E,!0);document.addEventListener("DOMContentLoaded",g);
diff --git a/assets/nmoBnL7tOp-128-BHUpV925.jpeg b/assets/nmoBnL7tOp-128-BHUpV925.jpeg
new file mode 100644
index 0000000..85b7a90
Binary files /dev/null and b/assets/nmoBnL7tOp-128-BHUpV925.jpeg differ
diff --git a/assets/nmoBnL7tOp-283-D6TnojWG.jpeg b/assets/nmoBnL7tOp-283-D6TnojWG.jpeg
new file mode 100644
index 0000000..a14793f
Binary files /dev/null and b/assets/nmoBnL7tOp-283-D6TnojWG.jpeg differ
diff --git a/assets/nmoBnL7tOp-283-DpfIv4U3.avif b/assets/nmoBnL7tOp-283-DpfIv4U3.avif
new file mode 100644
index 0000000..a44c57c
Binary files /dev/null and b/assets/nmoBnL7tOp-283-DpfIv4U3.avif differ
diff --git a/assets/noise.png b/assets/noise-9TQh8Crn.png
similarity index 100%
rename from assets/noise.png
rename to assets/noise-9TQh8Crn.png
diff --git a/assets/noise.avif b/assets/noise-Bjd68H6B.avif
similarity index 100%
rename from assets/noise.avif
rename to assets/noise-Bjd68H6B.avif
diff --git a/assets/xf0iDxB-MD-1152-jryTDRGR.jpeg b/assets/xf0iDxB-MD-1152-jryTDRGR.jpeg
new file mode 100644
index 0000000..a0cc3a7
Binary files /dev/null and b/assets/xf0iDxB-MD-1152-jryTDRGR.jpeg differ
diff --git a/assets/xf0iDxB-MD-1152-yCyddgLQ.avif b/assets/xf0iDxB-MD-1152-yCyddgLQ.avif
new file mode 100644
index 0000000..88a3c32
Binary files /dev/null and b/assets/xf0iDxB-MD-1152-yCyddgLQ.avif differ
diff --git a/assets/xf0iDxB-MD-1470-BQsuG7_e.avif b/assets/xf0iDxB-MD-1470-BQsuG7_e.avif
new file mode 100644
index 0000000..24f112a
Binary files /dev/null and b/assets/xf0iDxB-MD-1470-BQsuG7_e.avif differ
diff --git a/assets/xf0iDxB-MD-1470-ZULa8S1g.jpeg b/assets/xf0iDxB-MD-1470-ZULa8S1g.jpeg
new file mode 100644
index 0000000..0230927
Binary files /dev/null and b/assets/xf0iDxB-MD-1470-ZULa8S1g.jpeg differ
diff --git a/assets/xf0iDxB-MD-384-DlZZ2V67.avif b/assets/xf0iDxB-MD-384-DlZZ2V67.avif
new file mode 100644
index 0000000..186b096
Binary files /dev/null and b/assets/xf0iDxB-MD-384-DlZZ2V67.avif differ
diff --git a/assets/xf0iDxB-MD-384-NbbNBVlU.jpeg b/assets/xf0iDxB-MD-384-NbbNBVlU.jpeg
new file mode 100644
index 0000000..677c578
Binary files /dev/null and b/assets/xf0iDxB-MD-384-NbbNBVlU.jpeg differ
diff --git a/books/index.html b/books/index.html
new file mode 100644
index 0000000..85616d0
--- /dev/null
+++ b/books/index.html
@@ -0,0 +1 @@
+Books - joshua.seigler.net
Books
These books had a big influence on my thinking and taste.
I read this heady tome in college. I think I’ve completed it three times? It alternates between whimsical stories and theory, building a case that thought and meaning are emergent properties of the brain. It deals heavily with the idea of self-reference, which is the main theme uniting the three people in the title. Although he discounts the possibility of the immaterial aspect of reality as unknowable, Hofstadter introduced me to many interesting ideas and his book is a delightful journey, if you are prepared for it.
These stories contain so much richness. One theme that stuck with me emerges in Out of the Silent Planet and is repeated in Perelandra: that good things can be spoiled by overconsumption. Something that is pleasant or satisfying stands by itself, and doesn’t need to be repeated or hoarded. In fact, the drive to capture, concentrate, and control pleasant things can cheapen them, and could be at the root of many of our troubles.
This book painted for me a vivid picture of the mechanics of selfish and self-centered thinking. It describes in detail the ways that we blind ourselves, especially in interpersonal communication. The result of internalizing the concepts in this book is a sort of secular elaboration of “Love your neighbor”, but even though it misses (or omits? subtracts?) the spiritual core of things, it still rings quite true and the tools found in this book and others from the Arbinger Instutute are fantastically valuable. If this is of interest, you may also enjoy Marshall Rosenberg’s “Non-violent communication” or my article on needs-based communication.
This book synthesizes many pieces of the zeitgeist as I have seen it develop in my life. It touches on nihilism, the charismatic movement, yoga, eastern and new-age spirituality, and the UFO phenomenon. All these things are contextualized into a movement towards an upcoming religious synthesis, and contrasted with eastern Orthodoxy. Fr. Seraphim has a clear, academic writing style which I found easy to read, and this book answered many questions I had not even thought to ask. I also recommend his book/pamphlet Nihilism: The Root of the Revolution of the Modern Age, which is slightly drier than this but sets a good foundation for it, and The Soul After Death for its sober and thorough approach to understanding things most people have not witnessed directly.
This is the fascinating true story of a young man’s experiences with occult eastern gurus, the amazing adventures and troubles he had, and his conversations and visits with Elder Paisios of Mount Athos. He tells the story without embellishment, speaking plainly about the fantastic things that he saw and his thoughts and feelings as he struggled to find peace.
This book functions not only as an engaging story, but a primer for digital security as a whole. If it doesn’t make you an outright cypherpunk, you will at least understand the movement better.
A sympathetic main character, heaps of style, a hacker aesthetic, an evocative and lived-in setting, and non-stop action. This book magnified my love of the written word as a literal creative force. Digital reality and baseline reality are both shaped by language, but in different ways, and this story explores that distinction vigorously and memorably.
The illustrations in this surreal children’s book stuck with me my whole life. I like all this author’s illustrations, but this book especially captured my imagination.
This was my first programming book. My grandfather Clarence gave it to me along with a Radio Shack PC-2 handheld computer. That evening I managed to make a program that produced “music”, a random sequence of tones. I was hooked.
\ No newline at end of file
diff --git a/links/index.html b/links/index.html
new file mode 100644
index 0000000..cbaaf48
--- /dev/null
+++ b/links/index.html
@@ -0,0 +1 @@
+Links - joshua.seigler.net
I've used Jujutsu for a week or so. It's fantastic. I was going to write an introduction to Jujutsu article but this one is so much better than what I had planned. Read this one instead. I do wish it had a better name. Try looking up "Jujutsu conflict resolution" and you get a bunch of stuff about martial arts.
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.
git-revise is a history editing tool designed for the patch-stack workflow. It's fast, non-destructive, and aims to provide a familiar, powerful, and easy to use re-imagining of the patch stack workflow.
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.
\ No newline at end of file
diff --git a/assets/music/Îngerul a Strigat - Varlaam - glasul 3.pdf b/music/Îngerul a Strigat - Varlaam - glasul 3.pdf
similarity index 100%
rename from assets/music/Îngerul a Strigat - Varlaam - glasul 3.pdf
rename to music/Îngerul a Strigat - Varlaam - glasul 3.pdf
diff --git a/nmoBnL7tOp-128-BHUpV925.jpeg b/nmoBnL7tOp-128-BHUpV925.jpeg
new file mode 100644
index 0000000..85b7a90
Binary files /dev/null and b/nmoBnL7tOp-128-BHUpV925.jpeg differ
diff --git a/nmoBnL7tOp-283-D6TnojWG.jpeg b/nmoBnL7tOp-283-D6TnojWG.jpeg
new file mode 100644
index 0000000..a14793f
Binary files /dev/null and b/nmoBnL7tOp-283-D6TnojWG.jpeg differ
diff --git a/nmoBnL7tOp-283-DpfIv4U3.avif b/nmoBnL7tOp-283-DpfIv4U3.avif
new file mode 100644
index 0000000..a44c57c
Binary files /dev/null and b/nmoBnL7tOp-283-DpfIv4U3.avif differ
diff --git a/noise-9TQh8Crn.png b/noise-9TQh8Crn.png
new file mode 100644
index 0000000..113c016
Binary files /dev/null and b/noise-9TQh8Crn.png differ
diff --git a/noise-Bjd68H6B.avif b/noise-Bjd68H6B.avif
new file mode 100644
index 0000000..827005e
Binary files /dev/null and b/noise-Bjd68H6B.avif differ
diff --git a/noise.avif b/noise.avif
new file mode 100644
index 0000000..827005e
Binary files /dev/null and b/noise.avif differ
diff --git a/noise.png b/noise.png
new file mode 100644
index 0000000..113c016
Binary files /dev/null and b/noise.png differ
diff --git a/now/index.html b/now/index.html
new file mode 100644
index 0000000..91e2df7
--- /dev/null
+++ b/now/index.html
@@ -0,0 +1 @@
+Now - joshua.seigler.net
Now
June 7, 2025
I live in Southbridge, Massachusetts since 2022, with my wife Sara and our three cats. We’re starting to get more integrated here. I’m about to start a new role, my third or fourth startup depending on how you count it. I’m active in a local church. I recently changed my mind about olives (I like them now).
Goals
Learn to love God and to love people. Simple but difficult, gradual.
Drive success at my new job.
Improve my back-end and infrastructure skills to eventually own the “full-stack” label.
Build a passive income stream.
Explore non-tech career skills, in case the world gets even wierder than it is today.
Participate in communities:
Initiate and maintain connections with people around me (local community, neighbors, etc).
Digging through old bookmarks I found this alternate ruleset for Bananagrams I want to share:
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.
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.
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.
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.
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.
2025 disclaimer: I haven’t thought through all these ideas in a while, but I probably would change some of this or soften/rephrase it.
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.
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.
People respect consent in most of their face-to-face dealings with others. Violating someone’s 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.
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.
Here are some popular excuses for violating consent that you may have seen:
I am actually helping you.
You like some of the things I do, so you must accept this as well.
Everyone else lets me do this.
Everyone else said it was okay if I do this.
I am doing this, but someone else is responsible for my actions.
You agreed to this by being born here.
I am allowed to do this.
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.
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. 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 another’s person, without regard for consent.
One problem with authority is that all the people on earth are humans. There’s 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.
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.
You would think acting on someone in a way they don’t 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 else’s 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.
Solutions
Once you have seen through this trick, what can you do?
Look for ways to sidestep authority altogether.
Since very few people accept absolute 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.
Teach other people how to see these tricks more clearly.
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.
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.
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 don’t be surprised if their encounter with power changes their values.
Surround yourself with people who care about consent.
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.
\ No newline at end of file
diff --git a/posts/embracing-mysticism/index.html b/posts/embracing-mysticism/index.html
new file mode 100644
index 0000000..b9fc153
--- /dev/null
+++ b/posts/embracing-mysticism/index.html
@@ -0,0 +1 @@
+Embracing Mysticism - joshua.seigler.net
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.
In mid-2020 Vin Armani (now Cyprian) started calling this change “The Dim Age”[1]. 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.
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 Pageau’s project The Symbolic World, which has some very accessible videos breaking down movies and other pop culture artifacts from a symbolic perspective [2]. These commentaries did not seem arbitrary or speculative, but pointed to cultural trends that I couldn’t un-see once I understood them. I binged a bunch more of his material, including eventually a book his brother Mattheiu wrote, The Language of Creation: Cosmic Symbolism in Genesis[3]. Through this I discovered a side of reality I had been almost completely oblivious to, and what’s more, an aspect of my faith which had somehow completely passed me by.
From there I started listening to the Lord of Spirits podcast. I learned that commonplace, obvious understanding of existence as material and spiritual 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.
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 didn’t 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 wanting more and more.
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.
\ No newline at end of file
diff --git a/posts/ffmpeg-audio-cleanup/index.html b/posts/ffmpeg-audio-cleanup/index.html
new file mode 100644
index 0000000..60737fc
--- /dev/null
+++ b/posts/ffmpeg-audio-cleanup/index.html
@@ -0,0 +1,22 @@
+FFmpeg audio cleanup - joshua.seigler.net
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.
Although I could do it easily with Tenacity I didn’t want to use a manual process, since it would take days. So I tried using FFmpeg filters and Bash scripting.
I found an FFmpeg filter called compand which lets you map an input decibel range to an output decibel range. I also used the anlmdn filter to reduce noise, and the highpass filter to help with clarity.
I ran into a couple gotchas.
mpv does something special for audio playback that prevents audio from clipping. vlc plays the file as it is.
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 delay parameter with half the duration of the attack length fixed this.
If this is useful to you please leave a comment or send an email, I would love to hear about it.
\ No newline at end of file
diff --git a/posts/finally-a-coherent-worldview/index.html b/posts/finally-a-coherent-worldview/index.html
new file mode 100644
index 0000000..252f030
--- /dev/null
+++ b/posts/finally-a-coherent-worldview/index.html
@@ -0,0 +1 @@
+Finally, a Coherent Worldview - joshua.seigler.net
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.
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 don’t 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 ran to him while he was still far away!
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! It’s 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 don’t understand it at first.
\ No newline at end of file
diff --git a/posts/index.html b/posts/index.html
new file mode 100644
index 0000000..b84c076
--- /dev/null
+++ b/posts/index.html
@@ -0,0 +1 @@
+Posts - joshua.seigler.net
Authority is the idea that certain people are justified in violating consent. This belief allows people to force others to do what they want with a clear conscience.
\ No newline at end of file
diff --git a/posts/july-21-2025/index.html b/posts/july-21-2025/index.html
new file mode 100644
index 0000000..3cd396f
--- /dev/null
+++ b/posts/july-21-2025/index.html
@@ -0,0 +1 @@
+War - joshua.seigler.net
Today the USA announced its bombing of three locations in Iran, including Iran’s main nuclear enrichment site, located under a mountain in Fordow. How far will things go?
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[1]:
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.
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.
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.
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: “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).
May we not be tested beyond what we can bear, and may we have indestructible peace that is not of this world.
\ No newline at end of file
diff --git a/posts/my-very-own-github-pages/index.html b/posts/my-very-own-github-pages/index.html
new file mode 100644
index 0000000..f21f138
--- /dev/null
+++ b/posts/my-very-own-github-pages/index.html
@@ -0,0 +1,132 @@
+My Very Own GitHub Pages - joshua.seigler.net
I recently started self-hosting Forgejo, 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 webhook and Caddy. I’m very happy how it turned out.
The objective
When I push a gh-pages branch to any public repository on my Forgejo instance, the name of the repo is used as a domain name (e.g. marklink.pages.seigler.net) 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.
How to do it
Debian server preparation
In case you don’t have a basic server setup routine yet, this is a good start:
Change the default root password.
Create a new user and add it to the sudo group. In my examples below the user is joshua.
Use ssh-copy-id to install your ssl pubkey for easier login.
Disable/lock root’s password.
Disable root login over ssh and change the SSL port number. Pick a new port lower than 1024.
Edit your local ~/.ssh/config so you don’t have to specify the port number every time you connect.
On the server, install and enable ufw and fail2ban. In addition to allowing your custom SSL port, be sure to enable ports 80 and 443 with sudo ufw allow "WWW Full".
Caddy
I usually use nginx, but I wanted to give Caddy a shot, and it has been a great experience. I installed Caddy using the official instructions. 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.
/etc/caddy/Caddyfile
# Global options block
+{
+ email you@example.com #### CHANGE THIS ####
+ on_demand_tls {
+ ask http://localhost/check
+ }
+}
+
+# Webhooks
+https://webhooks.subdomain.here.tld { #### CHANGE THIS ####
+ reverse_proxy localhost:9000
+}
+
+# Filter for which SSL certs we will create. Prevents abuse.
+http://localhost {
+ handle /check {
+ root * /var/www
+ @deny not file /{query.domain}/
+ respond @deny 404
+ }
+}
+
+# This automatically handles upgrading http:// requests with a redirect
+https:// {
+ tls {
+ on_demand
+ }
+ root /var/www
+ rewrite /{host}{uri}
+ @forbidden {
+ path /.*
+ }
+ respond @forbidden 404
+ file_server
+}
+
+# Refer to the Caddy docs for more information:
+# https://caddyserver.com/docs/caddyfile
+
+# This config based on information at
+# https://caddy.community/t/on-demand-tls-with-dynamic-content-paths/18140
+# checked and corrected with `caddy validate`
I also took ownership of /var/www with chown -R joshua:joshua /var/www since the webhooks will run as my login account.
#!/bin/bash
+# parameter 1 is repo name
+[["$1"== *"/"* ]]&&exit1;
+[["$1"== *".."* ]]&&exit1;
+[["$1"== *"*"* ]]&&exit1;
+[-d"/var/www/$1"]||exit1;
+cd"/var/www";
+rm-rf"/var/www/$1";
To trigger these hooks I am using webhook which is in the default Debian repository.
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 uuidgen -r to create mine. Save these values so you can enter them in Forgejo later.
Also make sure to replace your execute-command lines with ones referencing your username and script paths.
Forgejo supports running webhooks conditionally triggered by certain conditions. Under my main user settings I set up each webhook:
Update pages
Target URL: https:// your domain here /hooks/update-pages HTTP Method: POST (the default) POST content type: application/json (the default) Secret: omitted, use your own Trigger on: Push events Branch filter: gh-pages
Remove pages
Target URL: https:// your domain here /hooks/remove-pages HTTP Method: POST (the default) POST content type: application/json (the default) Secret: omitted, use your own Trigger on: Custom Events > Repository > Delete Branch filter: gh-pages
That repo is just HTML and JS with only a gh-pages branch, but for repos with npm build scripts, I use gh-pages @ npm to push the build to a gh-pages branch and up to the server.
I’m putting off rolling my own CI server, but I imagine that’s the next stage here. Stay tuned.
\ No newline at end of file
diff --git a/posts/needs-based-communication/index.html b/posts/needs-based-communication/index.html
new file mode 100644
index 0000000..2273725
--- /dev/null
+++ b/posts/needs-based-communication/index.html
@@ -0,0 +1 @@
+Needs-based communication - joshua.seigler.net
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.
Needs
Needs 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):
Physical wellbeing - air, food, movement/exercise, rest/sleep, sexual expression, safety, shelter, touch, water Honesty - authenticity, integrity, presence Connection - 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 Play - joy, humor Peace - beauty, communion, ease, equality, harmony, inspiration, order Autonomy - choice, freedom, independence, space, spontaneity Meaning - 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
Everything anyone 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.
Conflict
Conflict happens when several peoples’ needs aren’t met. We get stuck in conflict when we mix up needs and strategies. Needs never conflict with each other, only strategies do.
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:
We suppress the need and move on, painfully leaving the problem unaddressed.
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.
We escalate, expanding the conflict in an attempt to win, at the other’s expense if necessary.
These resolutions can happen despite our best intentions, as a result of not understanding what’s happening as we fight. A very common mistake is to confuse needs and strategies.
Strategies
Strategies are things we do to meet our needs. In contrast to needs, which are abstract and universal, strategies are personal, specific, and widely varied.
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.
Jumping into a conflict strategy-first is bound to cause problems if that strategy doesn’t meet others’ needs as well as your own. The way past conflict is for everyone involved to understand each others’ needs, and then work together to find a strategy to meet those needs.
So, how do you figure out your own needs?
Feelings
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 abandoned, 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.
The truth is that the same situation can affect different people in very different ways. This means that feelings must come from a person’s own response to things. In order to see your own feelings clearly, it is important to take ownership of them as your feelings rather than something caused by the world around you. I have found this to be very challenging, but also incredibly rewarding.
CNVC provides an incomplete inventory of feelings:
Once you have an honest name for what you are feeling, think about what need sparked the feeling.
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 won’t need the formula, and can accomplish the same thing more naturally.
Here it is:
When [observation], I felt [feeling] because I was having a need for [need]. (possibly also a request:) Are you willing to [action]?
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.
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 and theirs.
There is a (similarly clunky) pattern for discovering someone else’s 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:
When you [observation] do you feel [feeling] because you are having a need for [need]? (possibly also:) Right now, would you like me to [action]?
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.
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 someone’s feelings and needs demonstrates that you are really interested in their problem.
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.
\ No newline at end of file
diff --git a/posts/site-design-updated/index.html b/posts/site-design-updated/index.html
new file mode 100644
index 0000000..821bf0e
--- /dev/null
+++ b/posts/site-design-updated/index.html
@@ -0,0 +1 @@
+Site design updated - joshua.seigler.net
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 pnpm, 11ty, and Nunjucks. Content is still in markdown.
One thing I’m proud of is a visual ping for footnotes.[1] When you click a footnote[2] it briefly highlights the thing you jumped to.
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. People who can read this are cool and I like them.
I also finally made a section for recipes!
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.
June 2025 edit: I have continued to alter the design. Pray I don’t alter it any further.
\ No newline at end of file
diff --git a/posts/the-trivium-a-tool-for-learning-anything/index.html b/posts/the-trivium-a-tool-for-learning-anything/index.html
new file mode 100644
index 0000000..839c719
--- /dev/null
+++ b/posts/the-trivium-a-tool-for-learning-anything/index.html
@@ -0,0 +1 @@
+The Trivium: A Tool for Learning Anything - joshua.seigler.net
Information today has become siloed. It’s 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 Trivium.
The ancients considered the liberal arts to be composed of seven parts. First was a foundation called the trivium, composed of grammar, logic, and rhetoric. Following that was the quadrivium, 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.
Grammar
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.
Logic
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.
Rhetoric
Rhetoric is about acting wisely: the application of knowledge and understanding, put into correct action. It answers “how?”
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.
\ No newline at end of file
diff --git a/posts/thinking-machines/index.html b/posts/thinking-machines/index.html
new file mode 100644
index 0000000..f9445a9
--- /dev/null
+++ b/posts/thinking-machines/index.html
@@ -0,0 +1 @@
+Thinking machines - joshua.seigler.net
There’s an exchange early in the classic '80s movie TRON. Some scientists are talking shop:
ALAN: I tell ya, ever since he got that Master Control Program, system’s got more bugs than a bait store.
GIBBS: Ehh, you gotta expect some static. After all, computers are just machines, they can’t think…
ALAN: Programs will be thinking soon.
GIBBS: (wryly) Hahaha, won’t that be grand – computers and the programs will start thinking, and the people will stop!
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?
Mom is always right
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.
All that to say, the work that LLM technology offers to relieve isn’t 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.
Attention must be paid
Simply put, an LLM is a document completion engine. You give it text, and it extends it. The result doesn’t 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 that’s not the point, it’s more of a happy accident.
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 can’t know what it’s like to be a human.
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. On Bullshit, Harry Frankfurt Untrustworthy.
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 Infocom’s success was built on the misuse of intellectual property, much as LLM companies have done AI, Copyright, and the Law: The Ongoing Battle Over Intellectual Property Rights , IP & Technology Law Society Generative AI Has an Intellectual Property Problem, Harvard Business Review.
I don’t think I am wise enough to safely use a genie in a bottle. And I don’t want to outsource my creative efforts to an addictive, bullshitting alien intellect, even if it might save time and effort in the short term.
\ No newline at end of file
diff --git a/posts/tools-of-the-trade/index.html b/posts/tools-of-the-trade/index.html
new file mode 100644
index 0000000..d04273c
--- /dev/null
+++ b/posts/tools-of-the-trade/index.html
@@ -0,0 +1 @@
+Tools of the trade - joshua.seigler.net
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 asdf, nvm, pyenv, venv, rbenv, and many other tool-specific version managers. Supports an incredible number of tools thanks to compatibility with asdf.
It also supports installing specific global tools, like angular-cli from npm, or stack-pr from pipx.
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 don’t need a custom CI flow or managed service for stacking to work - this CLI tool or one of the others at stacking.dev can take care of this.
If you start using PR stacks your whole company will start copying you.
Simple python script to update the members of a Slack group such as @oncall to match the active member(s) of a PagerDuty schedule. This replaces several expensive SAAS services.
For passwords. Sync across devices with syncthing.
\ No newline at end of file
diff --git a/recipes/amish-egg-noodles/index.html b/recipes/amish-egg-noodles/index.html
new file mode 100644
index 0000000..97c7177
--- /dev/null
+++ b/recipes/amish-egg-noodles/index.html
@@ -0,0 +1 @@
+Amish Egg Noodles - joshua.seigler.net
Amish Egg Noodles
Ingredients
6 tablespoons butter, divided
28 ounces chicken broth
1 chicken bouillon cube
12 ounces extra wide egg noodles
1 teaspoon parsley flakes
Salt and pepper, to taste
Instructions
In a large pan, brown two tablespoons of butter over medium heat.
Pour the chicken stock and bouillon cube into the pan and bring to a boil.
Add the egg noodles to the chicken stock and return to a boil. Cover the pot and remove from the heat.
Let the noodles set for 30 minutes, stirring every 10 minutes or so.
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.
Top with the remaining 4 tablespoons of butter, parsley, and salt and pepper to taste.
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.
Notes
We use 4.5 tsp of Better than Bouillon with 28oz water, replacing the broth and bouillon cube. We also usually brown some canned chicken and add it at the same time as the butter and seasonings.
Makes 6 servings. Each serving: Calories 328kcal (16%), Total Fat 14g (22%), Saturated Fat 7g (44%), Cholesterol 77mg (26%), Sodium 758mg (33%), Total Carbohydrates 41g (14%), Dietary Fiber 2g (8%), Sugar 1g (1%), Protein 9g (18%), Vitamin C 10.3mg (12%), Vitamin A 400IU (8%), Iron 1.5mg (8%), Calcium 41mg (4%), Potassium 266mg (8%)
\ No newline at end of file
diff --git a/recipes/chicken-chili-verde/index.html b/recipes/chicken-chili-verde/index.html
new file mode 100644
index 0000000..bec99c5
--- /dev/null
+++ b/recipes/chicken-chili-verde/index.html
@@ -0,0 +1 @@
+Chicken Chili Verde - joshua.seigler.net
Chicken Chili Verde
Serves six. Prep 20 minutes, cooking time about 1 hour. Mildly spicy. Requires an immersion blender or kitchen blender.
Ingredients
1-3 jalapeño peppers
1 Anaheim or Cubanelle pepper
6 tomatillos
2 large chicken breasts
1 large white onion
1 head of garlic
3 cups chicken stock
2 tsp neutral oil
Salt
Pepper
1 lime
1 tsp oregano
Fresh cilantro, optional
3 cups white rice
Directions
Rough chop the onion. Dice a little bit and set aside for a garnish.
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.
While that cooks, deseed the peppers.
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.
Set aside the seared veggies. Cook the rice by your preferred method.
When the chicken is done simmering, remove the breasts and add the broth, onions, etc to the veggies.
Add to the mixture half the lime juice, and salt, pepper, oregano, and cilantro.
Blend until very smooth.
Shred the chicken breasts with forks and add to the mixture.
Heat the mixture, covered, over medium heat for 15 minutes.
Serve over rice and garnish with diced onion and lime juice.
Notes
You can use jarred minced garlic instead of fresh, just delay adding it when you char the veggies because it will burn easily. Original recipe from Kevin Ashton.
\ No newline at end of file
diff --git a/recipes/corn-casserole/index.html b/recipes/corn-casserole/index.html
new file mode 100644
index 0000000..5c81d4c
--- /dev/null
+++ b/recipes/corn-casserole/index.html
@@ -0,0 +1 @@
+Corn Casserole - joshua.seigler.net
Corn Casserole
Ingredients
1 can of corn drained
1 can of creamed corn
1 stick melted butter 1/2 cup
1 box of Jiffy Corn Muffin mix
1 cup sour cream
Instructions
Preheat the oven to 350 degrees.
In a bowl, mix all of the ingredients together in order, then pour into a greased 8"x8" baking pan.
Cook uncovered for 45-50 minutes or until lightly browned.
Notes
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.
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.
\ No newline at end of file
diff --git a/recipes/creamy-chicken-orzo/index.html b/recipes/creamy-chicken-orzo/index.html
new file mode 100644
index 0000000..6e417af
--- /dev/null
+++ b/recipes/creamy-chicken-orzo/index.html
@@ -0,0 +1 @@
+Creamy Chicken Orzo - joshua.seigler.net
Creamy Chicken Orzo
Ingredients
2 boneless skinless chicken breasts, cooked and diced
8 ounces Orzo pasta
2 celery stalks, finely diced
2 carrots, finely diced
1/2 yellow onion, finely diced
5 tablespoons butter
2 tablespoons olive oil
2 cups chicken broth
½ cup heavy whipping cream
1 teaspoon chicken bouillon powder
1/3 cup all purpose flour
Instructions
Cook the Orzo per the package instructions.
While that cooks, make a mirepoix:
In a large skillet over medium high heat add the butter and olive oil.
Once the butter is melted add in the diced onion, carrots and celery.
Allow the veggies to sauté for 4-5 minutes until they start to soften up.
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.
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.
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 & enjoy!
Notes
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.
Makes 5 servings, 1700g. Each 340g serving: Calories 496kcal (25%), Total Fat 21g (32%), Saturated Fat 9g (45%), Trans Fat 0g, Cholesterol 102mg (34%), Sodium 504mg (21%), Total Carbohydrates 45g (15%), Dietary Fiber 3g (13%), Sugars 3g, Protein 30g (60%), Vitamin A 4646IU, Vitamin C 3mg, Calcium 78mg, Iron 2mg, Potassium 442mg
\ No newline at end of file
diff --git a/recipes/index.html b/recipes/index.html
new file mode 100644
index 0000000..11ebf0b
--- /dev/null
+++ b/recipes/index.html
@@ -0,0 +1 @@
+Recipes - joshua.seigler.net
\ No newline at end of file
diff --git a/recipes/luther-salad/index.html b/recipes/luther-salad/index.html
new file mode 100644
index 0000000..7f5a185
--- /dev/null
+++ b/recipes/luther-salad/index.html
@@ -0,0 +1 @@
+Luther Salad - joshua.seigler.net
Luther Salad
Ingredients
1 lb tri-color rotini
italian dressing
extras
cubed low-moisture mozzarella
frozen peas
shredded chicken
Instructions
Cook rotini in well salted water according to box directions. While rotini cooks, prepare your extras.
Drain pasta and rinse twice in cold water to remove starch and stop carryover cooking.
In a large bowl combine rotini and extras. Add italian dressing, at least 8 oz. Mix and serve or refrigerate.
Notes
At first we called this “worm salad” but this proved off-putting, and we needed a new name. We had recently learned about the 1521 Diet of Worms where Martin Luther was summoned to defend or recant his beliefs, so we called it “Luther salad” instead.
The base salad already covers elements of salt, fat, acid, and heat, so your extras are mostly for texture, leaving lots of room for variations:
Vegan / healthy:
halved cherry tomatoes
slivered sweet peppers
paysanne cucumber
Italian:
halved cherry tomatoes
sliced black olives, drained
cubed cheese
chopped pepperoni
Nutrition Information
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.
\ No newline at end of file
diff --git a/recipes/pasta-rosatella/index.html b/recipes/pasta-rosatella/index.html
new file mode 100644
index 0000000..a82abda
--- /dev/null
+++ b/recipes/pasta-rosatella/index.html
@@ -0,0 +1 @@
+Pasta Rosatella - joshua.seigler.net
Pasta Rosatella
Ingredients
1lb any pasta
2 cups (approximate) garlic & herb pasta sauce
1½ cups milk
2 tablespoons flour
2 tablespoons oil
Salt and pepper
Grated Parmesan cheese
Instructions
Cook the pasta according to the package directions.
Meanwhile in a saucepan, whisk together the oil and flour over medium heat to form a roux. Cook for 1–2 minutes until lightly golden.
Slowly whisk in the milk to make a béchamel and continue stirring until thickened.
Season with salt and pepper, and add cheese.
Stir in the pasta sauce and let the mixture simmer on low.
When the pasta is done cooking, drain it, then top with the sauce and extra cheese to serve.
Notes
The recipe works the same with almond milk and vegan mozarella replacing the existing dairy.
Makes 4 servings. Each serving: Calories 626kcal (31%) Total Fat 14.1g (18%) Saturated Fat 4.4g (22%) Trans Fat 0.19g Cholesterol 18.1mg (6%) Sodium 980.9mg (41%) Total Carbohydrate 100g (36%) Dietary Fiber 4.8g (17%) Total Sugars 10.7g (21%) Protein 22.8g (46%) Vitamin C 2.6mg (3%) Vitamin D 1.2mcg (6%) Iron 4.8mg (27%) Calcium 242.6mg (19%) Potassium 642.7mg (14%) Phosphorus 381.7mg (31%)
\ No newline at end of file
diff --git a/recipes/perfect-homemade-brownies/index.html b/recipes/perfect-homemade-brownies/index.html
new file mode 100644
index 0000000..1ffa5f2
--- /dev/null
+++ b/recipes/perfect-homemade-brownies/index.html
@@ -0,0 +1 @@
+Perfect Homemade Brownies - joshua.seigler.net
Perfect Homemade Brownies
Ingredients
1 cup butter
2 1/4 cups sugar
4 large eggs
1 1/4 cups cocoa powder
1 teaspoon salt
1 teaspoon baking powder
1 teaspoon espresso powder (optional)
1 tablespoon vanilla extract
1 1/2 cups all-purpose flour
2 cups semi-sweet chocolate chips
Instructions
Pre-heat the oven to 350 degrees. Butter a 9×13 baking dish.
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.
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.
Stir in the flour and chocolate chips until well combined.
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.
\ No newline at end of file
diff --git a/recipes/sloppy-joes/index.html b/recipes/sloppy-joes/index.html
new file mode 100644
index 0000000..dedb7c7
--- /dev/null
+++ b/recipes/sloppy-joes/index.html
@@ -0,0 +1 @@
+Sloppy Joes - joshua.seigler.net
Sloppy Joes
Ingredients
1 lb. hamburger
1/2 teaspoon paprika
1 teaspoon chili powder
1 Tablespoon dry mustard
1 Tablespoon parsley, chopped
1 Tablespoon Worcestershire sauce
2 Tablespoons brown sugar
2 Tablespoons apple cider vinegar
1/2 cup onion, diced
1/2 cup Ketchup
1 cup water
Instructions
Brown beef with onion, draining fat.
Add all remaining ingredients and bring to a boil.
Simmer 20 minutes or until thickened, stirring occasionally.
Refrigerate overnight, serve hot.
Notes
If you don’t have onion you can substitute 1/2 tablespoon onion powder. Recipe originally from Connie Henderson of Charlottesville, VA
Nutrition Information
Makes 9.5 100g servings. Each serving: Calories: 135 kcal (6%), Fat: 7.43g (15%), Cholesterol: 32 mg, Saturated Fat: 2.738g, Trans Fat: 0.408g, Carbohydrates: 7.62g (3%), Fiber: 0.4g (2%), Sugars: 5.99g, Protein: 9.26g (17%), Vitamin C: 1.8mg (2%), Vitamin A: 253 IU 1(1%), Vitamin D: 1 IU (0%)
\ No newline at end of file
diff --git a/recipes/spanish-style-rice/index.html b/recipes/spanish-style-rice/index.html
new file mode 100644
index 0000000..e116c50
--- /dev/null
+++ b/recipes/spanish-style-rice/index.html
@@ -0,0 +1 @@
+Spanish Style Rice - joshua.seigler.net
Spanish Style Rice
Ingredients
3 Tbsp neutral oil
2 cups long grain white rice
4 cups water
8 oz tomato sauce
2 Tbsp chicken or vegetable bouillon powder
1.5 cups water
Instructions
Add oil to a large frying pan over medium-high heat.
Add uncooked rice, stirring continually until rice is toasted.
Stir in 4 cups water, tomato sauce, and bouillon.
Return to boil and leave uncovered 10 minutes.
Stir in 1.5 cups water and return to a boil.
Reduce heat to low and cover. Simmer 10 minutes.
Turn off heat and leave in place, covered for 20 minutes.
Makes 4 servings. Each serving: Calories 441kcal (22%), Total Fat 11.3g (17%), Saturated Fat 1.9g (10%), Trans Fat 0.1g, Cholesterol 1mg (0%), Sodium 56mg (2%), Total Carbohydrates 76g (25%), Dietary Fiber 2g (6%), Sugars 0g, Protein 7g, Vitamin A (1%), Vitamin C (9%), Calcium (7%), Iron (24%)
\ No newline at end of file
diff --git a/assets/robots.txt b/robots.txt
similarity index 100%
rename from assets/robots.txt
rename to robots.txt
diff --git a/assets/scripts/main.ts b/scripts/main.ts
similarity index 100%
rename from assets/scripts/main.ts
rename to scripts/main.ts
diff --git a/search/index.html b/search/index.html
new file mode 100644
index 0000000..47ae604
--- /dev/null
+++ b/search/index.html
@@ -0,0 +1 @@
+Search - joshua.seigler.net
Search
\ No newline at end of file
diff --git a/assets/simple-atom.css b/simple-atom.css
similarity index 100%
rename from assets/simple-atom.css
rename to simple-atom.css
diff --git a/assets/simple-atom.xslt b/simple-atom.xslt
similarity index 100%
rename from assets/simple-atom.xslt
rename to simple-atom.xslt
diff --git a/assets/site.webmanifest b/site.webmanifest
similarity index 100%
rename from assets/site.webmanifest
rename to site.webmanifest
diff --git a/site/_data/site.js b/site/_data/site.js
deleted file mode 100644
index 1b9c3b8..0000000
--- a/site/_data/site.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const isDev = process.env.ELEVENTY_ENV === "development";
-
-const baseUrl = isDev ? "http://localhost:8080/" : "https://joshua.seigler.net/";
-
-export default {
- language: "en-US",
- title: "joshua.seigler.net",
- description: "Personal homepage of Joshua Seigler",
- baseUrl,
- author: "Joshua Seigler",
-};
diff --git a/site/_includes/-footer.njk b/site/_includes/-footer.njk
deleted file mode 100644
index 6322f41..0000000
--- a/site/_includes/-footer.njk
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
\ No newline at end of file
diff --git a/site/_includes/-header.njk b/site/_includes/-header.njk
deleted file mode 100644
index 8b7b48d..0000000
--- a/site/_includes/-header.njk
+++ /dev/null
@@ -1,35 +0,0 @@
-{%- from "components/tagList.njk" import tagList with context -%}
-
-
- {%- if cover %}
-
-
-
{{ title }}{% if rssUrl and page.url !== '/' %}{% endif %}
-
- {%- else %}
-
{{ title }}{% if rssUrl and page.url !== '/' %}{% endif %}
- {%- endif %}
-
- {%- if date and not omitMetadata -%}
-
- {{ date | formatDate("MMMM D, YYYY") }}
- {%- if updated and not omitMetadata %}
- (Updated {{ updated | formatDate("MMMM D, YYYY") }})
- {%- endif -%}
-
- {%- endif -%}
- {{ tagList(tags.slice(1)) }}
- {%- if coverInfo -%}
- Image: {{ coverInfo | markdown | safe }}
- {%- endif -%}
-
-
diff --git a/site/_includes/-inline-css.njk b/site/_includes/-inline-css.njk
deleted file mode 100644
index 556fdca..0000000
--- a/site/_includes/-inline-css.njk
+++ /dev/null
@@ -1 +0,0 @@
-{% include "css/mainfonts.css" %}
\ No newline at end of file
diff --git a/site/_includes/-taglist.njk b/site/_includes/-taglist.njk
deleted file mode 100644
index a7d11fe..0000000
--- a/site/_includes/-taglist.njk
+++ /dev/null
@@ -1,7 +0,0 @@
-
- {{ collectionList("posts", limit=5) }}
-
diff --git a/site/_includes/page.njk b/site/_includes/page.njk
deleted file mode 100644
index 2a03a42..0000000
--- a/site/_includes/page.njk
+++ /dev/null
@@ -1,9 +0,0 @@
----
-layout: base.njk
----
-{% if not omitTOC %}
- {{ content | toc('{"tags":["h2", "h3"],"wrapper":"span"}') | safe }}
-{% endif %}
-
- {{ content | safe }}
-
diff --git a/site/_includes/post.njk b/site/_includes/post.njk
deleted file mode 100644
index 2499306..0000000
--- a/site/_includes/post.njk
+++ /dev/null
@@ -1,13 +0,0 @@
----
-layout: base.njk
----
-{% if not omitTOC %}
- {{ content | toc('{"tags":["h2", "h3"],"wrapper":"span"}') | safe }}
-{% endif %}
-
- {{ content | safe }}
-
-
-
-
-
diff --git a/site/css.njk b/site/css.njk
deleted file mode 100644
index a14e297..0000000
--- a/site/css.njk
+++ /dev/null
@@ -1,6 +0,0 @@
----
-permalink: /site.css
-eleventyExcludeFromCollections: true
----
-{%include "css/site.css"%}
-{%include "css/prism.css"%}
diff --git a/site/feed.njk b/site/feed.njk
deleted file mode 100644
index 44d1935..0000000
--- a/site/feed.njk
+++ /dev/null
@@ -1,39 +0,0 @@
----
-eleventyExcludeFromCollections: true
-pagination:
- data: collections
- size: 1
- alias: tag
- filter:
- - all
- - pages
- - timeline
-eleventyComputed:
- finalLink: "{% if tag == 'combinedFeed' %}feed.xml{% else %}feeds/{{tag | slugify}}.xml{% endif %}"
- permalink: "/assets/{{finalLink}}"
----
-
-
-
- {{ site.title }}{% if tag !== 'combinedFeed' %} - {{ tag }}{% endif %}
- {{ collections.pages[tag].data.description or site.description }}
-
-
- {{ collections.posts | getNewestCollectionItemDate | dateToRfc3339 }}
- {{ site.baseUrl | addPathPrefixToFullUrl }}
-
- {{ site.author.name }}
-
- {%- for entry in collections[tag] | reverse %}
- {%- if entry.url and entry.date -%}
- {%- set absolutePostUrl %}{{ entry.url | htmlBaseUrl(site.baseUrl) }}{% endset %}
-
- {% if tag == 'combinedFeed' %}{{ entry.data.tags[0].slice(0,-1) | title }}: {% endif %}{{ entry.data.title }}
-
- {{ entry.date | dateToRfc3339 }}
- {{ absolutePostUrl }}
- {{ entry.content | renderTransforms(entry.data.page, site.baseUrl) }}
-
- {%- endif -%}
- {%- endfor %}
-
diff --git a/site/pages/about.md b/site/pages/about.md
deleted file mode 100644
index 86ff3e8..0000000
--- a/site/pages/about.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: about.njk
-permalink: /about/
----
-
-I'm the oldest of four boys, raised in a Christian home in Virginia. My parents homeschooled us, and the drive this gave me to learn new things and try them out has been a big help in my life. I'm naturally introverted, but I can present as extroverted: I love connecting with people, but quiet time to myself is how I recharge.
-
-After college I took some time figuring out what being an adult looked like for me. In 2010 after some priceless education in communication (thanks to a _Dish Network_ tech support job) and conflict resolution (thanks to my housemates at the time) I started my first engineering job up in Connecticut.
-
-Straight away I met my wife Sara. We started dating and it was clear we were compatibly weird. Pretty soon we got married. We like board games, food trucks, black cats, mini golf, and scenic road trips.
-
-One job led to another, and we moved around between Connecticut, Rhode Island, and Massachusetts. In 2017 I took a risk and started working remotely for a cryptocurrency company. Remote work was a big adjustment, but that unique role had lots of opportunities for travel and proved to be a good preparation for working remotely in smaller companies.
-
-The societal metamorphosis of 2019-2021 came at a time when I was also exploring a values shift, from politics as a source-of-truth back to faith, and I started trying to [learn to see the world mystically](/posts/embracing-mysticism). This began a change in my orientation that is still playing out.
-
-In my next few roles, I found that I have a taste for the laser focus and fast pace of startups. I like building exciting new things, talking to customers, owning whole sections of the product, juggling priorities, and balancing clean perfection against shipping quickly.
-
-I don't know what tomorrow holds, but I'm sure it's going to be great.
-
-## Timeline
diff --git a/site/pages/books/0007528418.jpg b/site/pages/books/0007528418.jpg
deleted file mode 100644
index d3b4d6a..0000000
Binary files a/site/pages/books/0007528418.jpg and /dev/null differ
diff --git a/site/pages/books/0395423317.jpg b/site/pages/books/0395423317.jpg
deleted file mode 100644
index 5d443f0..0000000
Binary files a/site/pages/books/0395423317.jpg and /dev/null differ
diff --git a/site/pages/books/0465026567.jpg b/site/pages/books/0465026567.jpg
deleted file mode 100644
index c482004..0000000
Binary files a/site/pages/books/0465026567.jpg and /dev/null differ
diff --git a/site/pages/books/0553380958.jpg b/site/pages/books/0553380958.jpg
deleted file mode 100644
index b1d41f3..0000000
Binary files a/site/pages/books/0553380958.jpg and /dev/null differ
diff --git a/site/pages/books/0765319853.jpg b/site/pages/books/0765319853.jpg
deleted file mode 100644
index 112fa3b..0000000
Binary files a/site/pages/books/0765319853.jpg and /dev/null differ
diff --git a/site/pages/books/0936200111.jpg b/site/pages/books/0936200111.jpg
deleted file mode 100644
index c84c733..0000000
Binary files a/site/pages/books/0936200111.jpg and /dev/null differ
diff --git a/site/pages/books/1523006560.jpg b/site/pages/books/1523006560.jpg
deleted file mode 100644
index 41fed9a..0000000
Binary files a/site/pages/books/1523006560.jpg and /dev/null differ
diff --git a/site/pages/books/188790400X.jpg b/site/pages/books/188790400X.jpg
deleted file mode 100644
index c6925b9..0000000
Binary files a/site/pages/books/188790400X.jpg and /dev/null differ
diff --git a/site/pages/books/1887904166.jpg b/site/pages/books/1887904166.jpg
deleted file mode 100644
index 9943221..0000000
Binary files a/site/pages/books/1887904166.jpg and /dev/null differ
diff --git a/site/pages/books/index.md b/site/pages/books/index.md
deleted file mode 100644
index 43a1320..0000000
--- a/site/pages/books/index.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-title: Books
-layout: "page.njk"
-omitTOC: true
-keywords: books
----
-These books had a big influence on my thinking and taste.
-
-
-
-### [ Gödel, Escher, Bach: an Eternal Golden Braid - Douglas Hofstadter](https://amzn.to/44Nvcuf)
-
-I read this heady tome in college. I think I've completed it three times? It alternates between whimsical stories and theory, building a case that thought and meaning are emergent properties of the brain. It deals heavily with the idea of self-reference, which is the main theme uniting the three people in the title. Although he discounts the possibility of the immaterial aspect of reality as unknowable, Hofstadter introduced me to many interesting ideas and his book is a delightful journey, if you are prepared for it.
-
-### [ The Space Trilogy: Out of the Silent Planet, Perelandra, and That Hideous Strength - C. S. Lewis](https://amzn.to/3SfO7Xc)
-
-These stories contain so much richness. One theme that stuck with me emerges in _Out of the Silent Planet_ and is repeated in _Perelandra_: that good things can be spoiled by overconsumption. Something that is pleasant or satisfying stands by itself, and doesn't need to be repeated or hoarded. In fact, the drive to capture, concentrate, and control pleasant things can cheapen them, and could be at the root of many of our troubles.
-
-### [ Leadership and Self-Deception - The Arbinger Institute](https://amzn.to/3GNsFGs)
-
-This book painted for me a vivid picture of the mechanics of selfish and self-centered thinking. It describes in detail the ways that we blind ourselves, especially in interpersonal communication. The result of internalizing the concepts in this book is a sort of secular elaboration of "Love your neighbor", but even though it misses (or omits? subtracts?) the spiritual core of things, it still rings quite true and the tools found in this book and others from the Arbinger Instutute are fantastically valuable.
-If this is of interest, you may also enjoy [Marshall Rosenberg's "Non-violent communication"](https://amzn.to/3SmSQqi) or [my article on needs-based communication](/posts/needs-based-communication/).
-
-### [ Orthodoxy and the Religion of the Future - Fr. Seraphim Rose](https://amzn.to/4jVqE9F)
-
-This book synthesizes many pieces of the zeitgeist as I have seen it develop in my life. It touches on nihilism, the charismatic movement, yoga, eastern and new-age spirituality, and the UFO phenomenon. All these things are contextualized into a movement towards an upcoming religious synthesis, and contrasted with eastern Orthodoxy. Fr. Seraphim has a clear, academic writing style which I found easy to read, and this book answered many questions I had not even thought to ask. I also recommend his book/pamphlet [Nihilism: The Root of the Revolution of the Modern Age](https://amzn.to/4jYlRnX), which is slightly drier than this but sets a good foundation for it, and [The Soul After Death](https://amzn.to/4iDaAIv) for its sober and thorough approach to understanding things most people have not witnessed directly.
-
-### [ The Gurus, the Young Man, and Elder Paisios - Dionysios Farasiotis](https://amzn.to/3GzsoXJ)
-
-This is the fascinating true story of a young man's experiences with occult eastern gurus, the amazing adventures and troubles he had, and his conversations and visits with Elder Paisios of Mount Athos. He tells the story without embellishment, speaking plainly about the fantastic things that he saw and his thoughts and feelings as he struggled to find peace.
-
-### [ Little Brother - Cory Doctorow](https://www.gutenberg.org/ebooks/30142)
-
-This book functions not only as an engaging story, but a primer for digital security as a whole. If it doesn't make you an outright cypherpunk, you will at least understand the movement better.
-
-### [ Snow Crash - Neal Stephenson](https://amzn.to/3SfPIMG)
-
-A sympathetic main character, heaps of style, a hacker aesthetic, an evocative and lived-in setting, and non-stop action. This book magnified my love of the written word as a literal creative force. Digital reality and baseline reality are both shaped by language, but in different ways, and this story explores that distinction vigorously and memorably.
-
-### [ The Stranger - Chris Van Allsburg](https://amzn.to/3SeBz2k)
-
-The illustrations in this surreal children's book stuck with me my whole life. I like all this author's illustrations, but this book especially captured my imagination.
-
-### [ Getting Started on the PC-2 - Harvard Pennington, Gary Camp, Ralph Burris](https://archive.org/details/gettingstartedon00harv)
-
-This was my first programming book. My grandfather Clarence gave it to me along with a Radio Shack PC-2 handheld computer. That evening I managed to make a program that produced "music", a random sequence of tones. I was hooked.
diff --git a/site/pages/home.md b/site/pages/home.md
deleted file mode 100644
index 74a67e4..0000000
--- a/site/pages/home.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-layout: home.njk
-title: Hello!
-description: Software engineer personal homepage
-permalink: /
----
-
-I'm Joshua Seigler, a software engineer since 2010 and a living being since the 1980s. I've watched technology advance from dial-up and Geocities pages, to federated social media and decentralized autonomous organizations.
-
-I currently work for a risk analysis startup called [QI Path](https://www.qipath.com/). My professional focus is on front-end development for web and mobile. See [/about](/about) for more detail.
-
-I would love to connect: [send me electronic mail](mailto:joshua@seigler.net?subject=found+your+website) or [drop in my unoffice hours](/unoffice-hours).
\ No newline at end of file
diff --git a/site/pages/links.md b/site/pages/links.md
deleted file mode 100644
index e69de29..0000000
diff --git a/site/pages/music.md b/site/pages/music.md
deleted file mode 100644
index 52948ec..0000000
--- a/site/pages/music.md
+++ /dev/null
@@ -1 +0,0 @@
-These are songs chanted during certain Eastern Orthodox services. I transcribed them with MuseScore from multiple sources, scanned or sung.
\ No newline at end of file
diff --git a/site/pages/now.md b/site/pages/now.md
deleted file mode 100644
index 3cff963..0000000
--- a/site/pages/now.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-title: Now
-layout: "page.njk"
-date: 2025-06-07
-omitTOC: true
-keywords: now
----
-
-I live in Southbridge, Massachusetts since 2022, with my wife Sara and our three cats. We're starting to get more integrated here. I'm about to start a new role, my third or fourth startup depending on how you count it. I'm active in [a local church](https://www.stmichaelorthodox.com/). I recently changed my mind about olives (I like them now).
-
-## Goals
-
-- Learn to love God and to love people. Simple but difficult, gradual.
-- Drive success at my new job.
-- Improve my back-end and infrastructure skills to eventually own the "full-stack" label.
-- Build a passive income stream.
-- Explore non-tech career skills, in case the world gets even wierder than it is today.
-- Participate in communities:
- - Initiate and maintain connections with people around me (local community, neighbors, etc).
- - Connect with other web and software developers.
diff --git a/site/pages/pages.json b/site/pages/pages.json
deleted file mode 100644
index ce5206d..0000000
--- a/site/pages/pages.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "layout": "collection.njk",
- "tags": ["pages"],
- "permalink": "/{{ page.fileSlug }}/"
-}
diff --git a/site/pages/posts.md b/site/pages/posts.md
deleted file mode 100644
index e69de29..0000000
diff --git a/site/pages/recipes.md b/site/pages/recipes.md
deleted file mode 100644
index 1ac1214..0000000
--- a/site/pages/recipes.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-keywords: recipes
----
-My most-made or most-requested recipes:
diff --git a/site/pages/search.njk b/site/pages/search.njk
deleted file mode 100644
index 6f00704..0000000
--- a/site/pages/search.njk
+++ /dev/null
@@ -1,12 +0,0 @@
----
-layout: base.njk
-permalink: search/index.html
-title: Search
----
-
-
-
-
-
-
-
diff --git a/site/pages/tag.njk b/site/pages/tag.njk
deleted file mode 100644
index 30364b1..0000000
--- a/site/pages/tag.njk
+++ /dev/null
@@ -1,24 +0,0 @@
----
-layout: "base.njk"
-pagination:
- data: collections
- size: 1
- alias: tag
- addAllPagesToCollections: true
- filter:
- - posts
- - recipes
- - timeline
-useTitle: true
-eleventyComputed:
- title: "Posts tagged #{{ tag }}"
- permalink: /tags/{{ tag | slugify }}/
- rssUrl: /feeds/{{ tag | slugify }}.xml
----
-{%- from "components/collectionList.njk" import collectionList with context -%}
-
-
- {{ content | safe }}
-
- {{ collectionList(tag) }}
-
diff --git a/site/pages/unoffice-hours.md b/site/pages/unoffice-hours.md
deleted file mode 100644
index fffa560..0000000
--- a/site/pages/unoffice-hours.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: Unoffice Hours
-layout: "page.njk"
-omitDate: true
-omitTOS: true
-keywords: Unoffice hours
----
-
-Working remotely has a lot of benefits, but we miss out on the serendipitous connections and socialization that happened just from being in the same room. Unoffice hours is part of an attempt to make new connections, but without applying the giant invisible filter of my own preferences.
-
-We could do some pair programming, talk about tech, life, matters of aesthetics or philosophy - the point is serendipity. If you want to call with no agenda, that's fine too, we can just get to know each other.
-
-Schedule a conversation
-
-The idea of unoffice hours comes from [Matt Webb](https://interconnected.org/home/2020/09/24/unoffice_hours). This site is part of an [Unoffice Hours Webring](https://unofficehours.com/) with other bloggers who have picked it up.
\ No newline at end of file
diff --git a/site/pages/uses.md b/site/pages/uses.md
deleted file mode 100644
index 319ae7b..0000000
--- a/site/pages/uses.md
+++ /dev/null
@@ -1,68 +0,0 @@
----
-title: What I Use
-layout: "page.njk"
-date: 2025-06-20
----
-
-## Hardware
-- Lenovo LOQ laptop (personal), Framework laptop (work).
-
-- Google Pixel 7 phone.
-
-- Wide IKEA GALANT desk (discontinued).
-
-- [65" curved 4k TV](https://www.zkelectronics.com/tv/samsung-qn65q7camfxza/), attached to the wall 1ft behind the desk so the image fills my field of view and 96dpi text is comfortable to read.
-
-- [Unitek KVM switch](https://amzn.to/3FEyxSs) to swap which laptop is "live".
-
-- [MOKOSE CS-lens 4k webcam](https://amzn.to/3FMLbyG) next to the TV for meetings.
-
-- [High-output LED light](https://amzn.to/4kUm2ku) in an [IKEA REGOLIT shade](https://www.ikea.com/us/en/p/regolit-pendant-lamp-shade-white-handmade-70103410/) for mood regulation and for the webcam.
-
-- [USB microphone with boom](https://amzn.to/4lgbwob) but I recently got [a better mic arm](https://amzn.to/4l2wE16).
-
-- [Sony WH1000XM2 headphones](https://www.sony.com/electronics/support/wireless-headphones-bluetooth-headphones/wh-1000xm2/specifications).
-
-- TOSLINK-to-bluetooth adapter, so headphones get HDMI audio passed through from the TV.
-
-- Mechanical keyboard, AJazz AK510 or DAS Keyboard S blank.
-
-## Software
-
-- [Fedora](https://fedoraproject.org/) desktop operating system. I recently switched from Manjaro. XFCE window manager with [Chicago95](https://github.com/grassmunk/Chicago95) theming.
-
-- [Debian](https://www.debian.org/) server operating system.
-
-- [GrapheneOS](https://grapheneos.org/) OS for Android with a privacy focus.
-
-- [SyncThing](https://syncthing.net/) file sync. P2P alternative to Dropbox, supports mobile and desktop. Synchronizes folders of content across all my devices.
-
-- [Mise](https://mise.jdx.dev/) Dev environment manager, replacing `nvm`, `pyenv`, `venv`, and dozens of others. Great DX.
-
-- [Stack-PR](https://github.com/modular/stack-pr) PR stacking tool, the best way I know to handle feature branches.
-
-- [VSCodium](https://vscodium.com/) IDE. VSCode with less Microsoft.
-
-- [Obsidian](https://obsidian.md/) for notes and reference.
-
-- [KeePassXC](https://keepassxc.org/) secret management.
-
-## Services
-
-- [FastMail](https://www.fastmail.com/) email, calendar, and contact hosting.
-
-- [DartNode](https://dartnode.com?aff=WigglySalmon747) VPS. Good value and specs, lets me bring my own server OS image.
-
-- [NameSilo](https://www.namesilo.com/?rid=df01e27pr) domain registrar. Good prices, doesn't charge extra for domain privacy.
-
-- [Umami](https://umami.is/) analytics, self-hosted.
-
-- [Forgejo](https://forgejo.org/) git forge, self-hosted. Mirroring GitHub for now.
-
-- [Webhook](https://github.com/adnanh/webhook/) to pull static sites when they are built.
-
-- [Shaarli](https://github.com/shaarli/Shaarli) link site, self-hosted.
-
-- [Isso](https://isso-comments.de/) comments API, self hosted.
-
-- [HedgeDoc](https://hedgedoc.org/) markdown document collaboration, self-hosted.
diff --git a/site/pages/webrings.md b/site/pages/webrings.md
deleted file mode 100644
index 1681ab5..0000000
--- a/site/pages/webrings.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: Webrings
-layout: "page.njk"
-omitTOC: true
-keywords: webrings
----
-
-
-Sites that allow you to book a web meeting to talk about stuff. Like office hours, if you remember those.
-
-[< prev](https://unofficehours.com/prev.html) [list](https://unofficehours.com) [join](https://unofficehours.com/join.html) [random](https://unofficehours.com/random.html) [next >](https://unofficehours.com/next.html)
-
-
-Sites with a dark theme.
-
diff --git a/site/posts/2020-07-02-authority-consents-blind-spot/index.md b/site/posts/2020-07-02-authority-consents-blind-spot/index.md
deleted file mode 100644
index f3dfb3c..0000000
--- a/site/posts/2020-07-02-authority-consents-blind-spot/index.md
+++ /dev/null
@@ -1,86 +0,0 @@
----
-title: Authority - Consent's Blind Spot
-description: Authority is the idea that certain people are justified in violating consent. This belief allows people to force others to do what they want with a clear conscience.
-tags:
- - ethos
----
-
-> 2025 disclaimer: I haven't thought through all these ideas in a while, but I probably would change some of this or soften/rephrase it.
-
-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.
-
-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.
-
-People respect consent in most of their face-to-face dealings with others. Violating someone’s 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.
-
-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.
-
-Here are some popular excuses for violating consent that you may have seen:
-
-> I am actually helping you.
-
-> You like some of the things I do, so you must accept this as well.
-
-> Everyone else lets me do this.
-
-> Everyone else said it was okay if I do this.
-
-> I am doing this, but someone else is responsible for my actions.
-
-> You agreed to this by being born here.
-
-> I am allowed to do this.
-
-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.
-
-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.
-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 another's person, without regard for consent.
-
-One problem with authority is that all the people on earth are humans. There's 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.
-
-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.
-
-You would think acting on someone in a way they don’t 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 else’s 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.
-
-## Solutions
-
-Once you have seen through this trick, what can you do?
-
-### Look for ways to sidestep authority altogether.
-
-Since very few people accept _absolute_ 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.
-
-- [How to Opt Out of the Technocratic State (PDF)](https://theconsciousresistance.com/wp-content/uploads/2020/01/How_to_Opt_Out_of_the_Technocratic_State.pdf) by Derrick Broze
-- [An Agorist Primer (PDF)](http://www.kopubco.com/pdf/An_Agorist_Primer_by_SEK3.pdf) by Samuel Edward Konkin III
-- [The Seasteading Institute](https://www.seasteading.org/)
-
-### Teach other people how to see these tricks more clearly.
-
-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.
-
-- [Playlist: Thomasz Kaye Animations](https://www.youtube.com/playlist?list=PL4jzSARXHuuwhBfzGNYhSVE4gJ8zmRnTH)
-- [Foundation for Economic Education](https://fee.org/stories)
-
-### Promote alternatives that respect consent.
-
-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.
-
-- [The Machinery of Freedom (PDF)](http://daviddfriedman.com/The_Machinery_of_Freedom_.pdf) [(Ebook)](http://daviddfriedman.com/The_Machinery_of_Freedom.prc) [(Video)](https://www.youtube.com/watch?v=jTYkdEU_B4o) by David D Friedman
-
-### Use the ceremonies of authority against itself.
-
-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 don't be surprised if their encounter with power changes their values.
-
-- [Libertarian Party](https://lp.org/)
-
-### Surround yourself with people who care about consent.
-
-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.
-
-- [Free State Project](https://www.fsp.org/)
-
-## Additional Resources
-
-- [The Problem of Political Authority (Chapter 1)](https://spot.colorado.edu/~huemer/1.htm) [(Amazon)](https://amzn.to/2AyQxw0) by Michael Huemer
-- [The Most Dangerous Superstitition (PDF)](https://ia601208.us.archive.org/27/items/236222899TheMostDangerousSuperstitionLarkenRose2011/the-most-dangerous-superstition-larken-rose-20111.pdf) by Larken Rose
-- [The Law](http://bastiat.org/en/the_law.html) by Frédéric Bastiat
diff --git a/site/posts/2021-04-03-trivium/cover.jpg b/site/posts/2021-04-03-trivium/cover.jpg
deleted file mode 100644
index 1b1db0f..0000000
Binary files a/site/posts/2021-04-03-trivium/cover.jpg and /dev/null differ
diff --git a/site/posts/2021-04-03-trivium/index.md b/site/posts/2021-04-03-trivium/index.md
deleted file mode 100644
index 2dead56..0000000
--- a/site/posts/2021-04-03-trivium/index.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-title: 'The Trivium: A Tool for Learning Anything'
-description: An ancient methodology for learning, which formed the basis of classical education in the Middle Ages and Rennaisance.
-tags:
- - learning
- - how to
-cover: "cover.jpg"
-coverInfo: "[The seven Liberal Arts - Museo del Prado](https://www.museodelprado.es/en/the-collection/art-work/the-seven-liberal-arts/89d9f351-fff6-4141-9efc-d5ea2951b488)"
-date: 2021-04-03
-updated: 2025-07-01
----
-
-Information today has become siloed. It's 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 _Trivium_.
-
-The ancients considered the liberal arts to be composed of seven parts. First was a foundation called the _trivium_, composed of grammar, logic, and rhetoric. Following that was the _quadrivium_, 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.
-
-## Grammar
-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.
-
-## Logic
-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.
-
-## Rhetoric
-Rhetoric is about acting wisely: the application of knowledge and understanding, put into correct action. It answers "how?"
-
-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.
-
-## Resources
-
-- [Trivium Binder Project](https://triviumbinder.blogspot.com/)
-- [Tragedy and Hope: Five page summary of the Trivium](http://www.scribd.com/doc/59477946/Trivium-Method-of-Critical-Thinking-and-Creative-Problem-Solving)
-- [Shadows of the trivium in narrow disciplines](https://www.scribd.com/document/33744483/Trivium-Method-of-Thinking-vs-Other-Methodologies)
diff --git a/site/posts/2021-05-26-needs-based-communication/cover.jpg b/site/posts/2021-05-26-needs-based-communication/cover.jpg
deleted file mode 100644
index c17f501..0000000
Binary files a/site/posts/2021-05-26-needs-based-communication/cover.jpg and /dev/null differ
diff --git a/site/posts/2021-05-26-needs-based-communication/index.md b/site/posts/2021-05-26-needs-based-communication/index.md
deleted file mode 100644
index b0920f3..0000000
--- a/site/posts/2021-05-26-needs-based-communication/index.md
+++ /dev/null
@@ -1,112 +0,0 @@
----
-title: Needs-based communication
-description: How to connect with others through shared human needs.
-tags:
- - communication
- - how to
-date: 2021-05-26
-updated: 2025-06-30
-cover: "cover.jpg"
-coverInfo: "[David Clode](https://unsplash.com/photos/two-birds-sitting-on-top-of-a-white-rope-VYEBlG63bwc)"
----
-
-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.
-
-## Needs
-
-**Needs** 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):
-
-**Physical wellbeing** - air, food, movement/exercise, rest/sleep, sexual expression, safety, shelter, touch, water
-**Honesty** - authenticity, integrity, presence
-**Connection** - 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
-**Play** - joy, humor
-**Peace** - beauty, communion, ease, equality, harmony, inspiration, order
-**Autonomy** - choice, freedom, independence, space, spontaneity
-**Meaning** - 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
-
-Everything _anyone_ 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.
-
-## Conflict
-
-**Conflict** happens when several peoples' needs aren't met. We get stuck in conflict when we mix up needs and strategies. Needs never conflict with each other, only strategies do.
-
-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:
-
-1. We suppress the need and move on, painfully leaving the problem unaddressed.
-2. 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.
-3. We escalate, expanding the conflict in an attempt to win, at the other's expense if necessary.
-
-These resolutions can happen despite our best intentions, as a result of not understanding what's happening as we fight. A very common mistake is to confuse needs and strategies.
-
-## Strategies
-
-**Strategies** are things we do to meet our needs. In contrast to needs, which are abstract and universal, strategies are personal, specific, and widely varied.
-
-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.
-
-Jumping into a conflict strategy-first is bound to cause problems if that strategy doesn't meet others' needs as well as your own. The way past conflict is for everyone involved to understand each others' needs, and _then_ work together to find a strategy to meet those needs.
-
-So, **how do you figure out your own needs?**
-
-## Feelings
-
-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 _abandoned_, 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.
-
-The truth is that the same situation can affect different people in very different ways. This means that feelings must come from a person's own response to things. In order to see your own feelings clearly, it is important to take ownership of them as _your_ feelings rather than something caused by the world around you. I have found this to be very challenging, but also incredibly rewarding.
-
-CNVC provides an incomplete inventory of feelings:
-
-### Feelings when needs are met
-**Affectionate** - compassionate, friendly, loving, open-hearted, sympathetic, tender, warm
-**Engaged** - absorbed, alert, curious, engrossed, enchanted, entranced, fascinated, interested, intrigued, involved, spellbound, stimulated
-**Hopeful** - expectant, encouraged, optimistic
-**Confident** - empowered, open, proud, safe, secure
-**Excited** - amazed, animated, ardent, aroused, astonished, dazzled, eager, energetic, enthusiastic, giddy, invigorated, lively, passionate, surprised, vibrant
-**Grateful** - appreciative, moved, thankful, touched
-**Inspired** - amazed, awed, wonder
-**Refreshed** - enlivened, rejuvenated, renewed, rested, restored, revived
-
-### Feelings when needs are not met
-**Afraid** - apprehensive, dread, foreboding, frightened, mistrustful, panicked, petrified, scared, suspicious, terrified, wary, worried
-**Annoyed** - aggravated, dismayed, disgruntled, displeased, exasperated, frustrated, impatient, irritated, irked
-**Angry** - enraged, furious, incensed, indignant, irate, livid, outraged, resentful
-**Aversion** - animosity, appalled, contempt, disgusted, dislike, hate, horrified, hostile, repulsed
-**Confused** - ambivalent, baffled, bewildered, dazed, hesitant, lost, mystified, perplexed, puzzled, torn
-**Disconnected** - alienated, aloof, apathetic, bored, cold, detached, distant, distracted, indifferent, numb, removed, uninterested, withdrawn
-**Disquiet** - agitated, alarmed, discombobulated, disconcerted, disturbed, perturbed, rattled, restless, shocked, startled, surprised, troubled, turbulent, turmoil, uncomfortable, uneasy, unnerved, unsettled, upset
-**Embarrassed** - ashamed, chagrined, flustered, guilty, mortified, self-conscious
-**Fatigue** - beat, burnt out, depleted, exhausted, lethargic, listless, sleepy, tired, weary, worn out
-**Pain** - agony, anguished, bereaved, devastated, grief, heartbroken, hurt, lonely, miserable, regretful, remorseful
-**Sad** - depressed, dejected, despair, despondent, disappointed, discouraged, disheartened, forlorn, gloomy, heavy-hearted, hopeless, melancholy, unhappy, wretched
-**Tense** - anxious, cranky, distressed, distraught, edgy, fidgety, frazzled, irritable, jittery nervous, overwhelmed, restless, stressed out
-**Vulnerable** - fragile, guarded, helpless, insecure, leery, reserved, sensitive, shaky
-**Yearning** - envious, jealous, longing, nostalgic, pining, wistful
-
-## Resolving feelings from unmet needs
-Once you have an honest name for what you are feeling, think about what need sparked the feeling.
-
-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 won't need the formula, and can accomplish the same thing more naturally.
-
-Here it is:
-
-> When _[observation]_, I felt _[feeling]_ because I was having a need for _[need]_. (possibly also a request:) Are you willing to _[action]_?
-
-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.
-
-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 _and_ theirs.
-
-There is a (similarly clunky) pattern for discovering someone else's 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:
-
-> When you _[observation]_ do you feel _[feeling]_ because you are having a need for _[need]_? (possibly also:) Right now, would you like me to _[action]_?
-
-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.
-
-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 someone's feelings and needs demonstrates that you are really interested in their problem.
-
-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.
-
-Some resources for exploring these ideas more:
-
-- [The Right Words and Beyond](http://www.therightword.info/)
-- [Nonviolent Communication: A Language of Life](https://amzn.to/44cpIsV), ISBN 189200528X
-- [The Center for Nonviolent Communication](https://www.cnvc.org/)
diff --git a/site/posts/2021-10-16-embracing-mysticism/index.md b/site/posts/2021-10-16-embracing-mysticism/index.md
deleted file mode 100644
index 7261b0a..0000000
--- a/site/posts/2021-10-16-embracing-mysticism/index.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-title: Embracing Mysticism
-description: Society is moving from a materialistic era into a mystical one. I describe my attempt to gain mystical proficiency.
-tags:
- - faith
- - ethos
----
-
-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.
-
-In mid-2020 Vin Armani (now Cyprian) started calling this change "The Dim Age"^[[Free Man Beyond The Wall episode 478: We've Entered The 'Dim Age'](https://freemanbeyondthewall.libsyn.com/episode-478)]. 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.
-
-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 Pageau's project [The Symbolic World](https://thesymbolicworld.com/), which has some very accessible videos breaking down movies and other pop culture artifacts from a symbolic perspective ^[[Symbolism and Propaganda in Popular Culture](https://thesymbolicworld.com/videos/symbolism-propaganda-in-popular-culture/), [The Fall of Loki (Into the Multiverse)](https://thesymbolicworld.com/videos/the-fall-of-loki-into-the-multiverse/)]. These commentaries did not seem arbitrary or speculative, but pointed to cultural trends that I couldn't un-see once I understood them. I binged a bunch more of his material, including eventually a book his brother Mattheiu wrote, _The Language of Creation: Cosmic Symbolism in Genesis_^[[The Language of Creation: Cosmic Symbolism in Genesis: A Commentary](https://amzn.to/4iBOExr), ISBN 978-1981549337]. Through this I discovered a side of reality I had been almost completely oblivious to, and what's more, an aspect of my faith which had somehow completely passed me by.
-
-From there I started listening to the [Lord of Spirits](https://www.ancientfaith.com/podcasts/lordofspirits) podcast. I learned that commonplace, obvious understanding of existence as material _and spiritual_ 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.
-
-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 didn't 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 _wanting_ more and more.
-
-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.
diff --git a/site/posts/2023-07-14-finally-a-coherent-worldview/index.md b/site/posts/2023-07-14-finally-a-coherent-worldview/index.md
deleted file mode 100644
index e2989d5..0000000
--- a/site/posts/2023-07-14-finally-a-coherent-worldview/index.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-title: Finally, a Coherent Worldview
-description: Why did I think I could figure everything out on my own?
-tags:
- - faith
- - ethos
----
-
-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.
-
-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 don't 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 _ran_ to him while he was still far away!
-
-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! It's 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 don't understand it at first.
diff --git a/site/posts/2024-06-05-redesign/index.md b/site/posts/2024-06-05-redesign/index.md
deleted file mode 100644
index 652a994..0000000
--- a/site/posts/2024-06-05-redesign/index.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-title: Site design updated
-description: New look, simpler tech.
-tags:
- - technical
----
-
-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 [pnpm](https://pnpm.io/), [11ty](https://www.11ty.dev/), and [Nunjucks](https://mozilla.github.io/nunjucks/). Content is still in [markdown](https://daringfireball.net/projects/markdown/).
-
-One thing I'm proud of is a visual ping for footnotes.^[It highlights when you click back, too.] When you click a footnote^[Hi.] it briefly highlights the thing you jumped to.
-
-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. People who can read this are cool and I like them.
-
-I also finally made a section for recipes!
-
-> 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.
-
-> June 2025 edit: I have continued to alter the design. Pray I don't alter it any further.
\ No newline at end of file
diff --git a/site/posts/2025-04-24-thinking-machines/computers-will-start-thinking.jpg b/site/posts/2025-04-24-thinking-machines/computers-will-start-thinking.jpg
deleted file mode 100644
index 41dce5f..0000000
Binary files a/site/posts/2025-04-24-thinking-machines/computers-will-start-thinking.jpg and /dev/null differ
diff --git a/site/posts/2025-04-24-thinking-machines/cover.jpg b/site/posts/2025-04-24-thinking-machines/cover.jpg
deleted file mode 100644
index 9f4529f..0000000
Binary files a/site/posts/2025-04-24-thinking-machines/cover.jpg and /dev/null differ
diff --git a/site/posts/2025-04-24-thinking-machines/end-of-line.jpg b/site/posts/2025-04-24-thinking-machines/end-of-line.jpg
deleted file mode 100644
index 777238d..0000000
Binary files a/site/posts/2025-04-24-thinking-machines/end-of-line.jpg and /dev/null differ
diff --git a/site/posts/2025-04-24-thinking-machines/index.md b/site/posts/2025-04-24-thinking-machines/index.md
deleted file mode 100644
index 7c22cc2..0000000
--- a/site/posts/2025-04-24-thinking-machines/index.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-title: Thinking machines
-slug: thinking-machines
-description: "The computers will start thinking, and people will stop."
-tags:
- - zeitgeist
- - ai
-cover: "cover.jpg"
----
-
-There's an exchange early in the classic '80s movie [TRON](https://www.themoviedb.org/movie/97-tron). Some scientists are talking shop:
-
-
-
-> **ALAN:** I tell ya, ever since he got that Master Control Program, system's got more bugs than a bait store.
->
-> **GIBBS:** Ehh, you gotta expect some static. After all, computers are just machines, they can't think...
->
-> **ALAN:** Programs will be thinking _soon_.
->
-> **GIBBS:** (wryly) Hahaha, won't that be grand -- *computers and the programs will start thinking, and the people will stop!*
-
-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?
-
-## Mom is always right
-
-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.
-
-All that to say, the work that LLM technology offers to relieve isn't 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.
-
-## Attention must be paid
-
-Simply put, an LLM is a document completion engine. You give it text, and it extends it. The result doesn't 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 that's not the point, it's more of a happy accident.
-
-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 can't know what it's like to be a human.
-
-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. !, _Harry Frankfurt_!! Untrustworthy.
-
-## Don't create the torment nexus
-
-LLMs clearly manifest a type of intelligence. Sure, it's "just" some linear algebra and a ton of data. But it does exhibit a type of intelligence. One without empathy. !, _AP News_
-[Belgian man dies by suicide following exchanges with chatbot](https://www.brusselstimes.com/430098/belgian-man-commits-suicide-following-exchanges-with-chatgpt), _Brussels Times_
-[AI-Fueled Spiritual Delusions Are Destroying Human Relationships](https://www.rollingstone.com/culture/culture-features/ai-spiritual-delusions-destroying-human-relationships-1235330175/), _Rolling Stone_!! Not being human, it *can't* have empathy---and intelligence without empathy can be dangerous.
-
-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 Infocom's success was built on the misuse of intellectual property, much as LLM companies have done !, _IP & Technology Law Society_
-[Generative AI Has an Intellectual Property Problem](https://hbr.org/2023/04/generative-ai-has-an-intellectual-property-problem), _Harvard Business Review_!!.
-
-I don't think I am wise enough to safely use a genie in a bottle. And I don't want to outsource my creative efforts to an addictive, bullshitting alien intellect, even if it might save time and effort in the short term.
-
-
diff --git a/site/posts/2025-05-15-tools-of-the-trade/index.md b/site/posts/2025-05-15-tools-of-the-trade/index.md
deleted file mode 100644
index 40ff74c..0000000
--- a/site/posts/2025-05-15-tools-of-the-trade/index.md
+++ /dev/null
@@ -1,41 +0,0 @@
----
-title: Tools of the trade
-slug: tools-of-the-trade
-description: Some dev tools I recommend.
-tags:
- - technical
- - software
----
-
-Everyone has different tools that they find especially effective. Here are some I have found with a few words about why I like them.
-
-> Update: I made a [/uses](/uses) page that lists these tools and many others I like.
-
-### [mise-en-place](https://mise.jdx.dev/)
-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 `asdf`, `nvm`, `pyenv`, `venv`, `rbenv`, and many other tool-specific version managers. Supports an incredible number of tools thanks to compatibility with `asdf`.
-
-It also supports installing specific global tools, like `angular-cli` from `npm`, or `stack-pr` from `pipx`.
-
-### [stack-pr](https://github.com/modular/stack-pr)
-Open source tool for [stacking PRs](https://www.stacking.dev/).
-
-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 don't need a custom CI flow or managed service for stacking to work - this CLI tool or one of the others at [stacking.dev](https://www.stacking.dev/) can take care of this.
-
-If you start using PR stacks your whole company will start copying you.
-
-### [xc](https://xcfile.dev/)
-Markdown based task runner.
-
-Define tasks in code blocks in markdown, and call them from the CLI. Serves as both task definition and documentation.
-
-### [pd2slack](https://github.com/sidpremkumar/pd2slack)
-Simple python script to update the members of a Slack group such as `@oncall` to match the active member(s) of a PagerDuty schedule. This replaces several expensive SAAS services.
-
-### [SyncThing](https://syncthing.net/)
-P2P alternative to Dropbox, supports mobile and desktop. Synchronize folders of content across all my devices.
-
-### [Obsidian](https://obsidian.md/)
-For notes and reference. Sync across devices with `syncthing`.
-
-### [KeePassXC](https://keepassxc.org/)
-For passwords. Sync across devices with `syncthing`.
diff --git a/site/posts/2025-06-15-replacing-github-pages/index.md b/site/posts/2025-06-15-replacing-github-pages/index.md
deleted file mode 100644
index 8e9bd58..0000000
--- a/site/posts/2025-06-15-replacing-github-pages/index.md
+++ /dev/null
@@ -1,225 +0,0 @@
----
-title: My Very Own GitHub Pages
-slug: my-very-own-github-pages
-description: How to self-host Forgejo and automatically serve your web build branches with SSL.
-tags:
- - how to
- - technical
- - selfhosting
----
-
-I recently started self-hosting [Forgejo](https://forgejo.org/), 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 [webhook](https://github.com/adnanh/webhook) and [Caddy](https://caddyserver.com/). I'm very happy how it turned out.
-
-## The objective
-When I push a `gh-pages` branch to any public repository on my Forgejo instance, the name of the repo is used as a domain name (e.g. [marklink.pages.seigler.net](https://marklink.pages.seigler.net/)) 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.
-
-## How to do it
-
-### Debian server preparation
-In case you don't have a basic server setup routine yet, this is a good start:
-- Change the default root password.
-- Create a new user and add it to the sudo group. In my examples below the user is `joshua`.
-- Use `ssh-copy-id` to install your ssl pubkey for easier login.
-- Disable/lock root's password.
-- Disable root login over ssh and change the SSL port number. Pick a new port lower than 1024.
-- Edit your local `~/.ssh/config` so you don't have to specify the port number every time you connect.
-- On the server, install and enable `ufw` and `fail2ban`. In addition to allowing your custom SSL port, be sure to enable ports 80 and 443 with `sudo ufw allow "WWW Full"`.
-
-### Caddy
-I usually use nginx, but I wanted to give Caddy a shot, and it has been a great experience. I installed Caddy using the [official instructions](https://caddyserver.com/docs/install).
-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.
-
-`/etc/caddy/Caddyfile`
-```caddy
-# Global options block
-{
- email you@example.com #### CHANGE THIS ####
- on_demand_tls {
- ask http://localhost/check
- }
-}
-
-# Webhooks
-https://webhooks.subdomain.here.tld { #### CHANGE THIS ####
- reverse_proxy localhost:9000
-}
-
-# Filter for which SSL certs we will create. Prevents abuse.
-http://localhost {
- handle /check {
- root * /var/www
- @deny not file /{query.domain}/
- respond @deny 404
- }
-}
-
-# This automatically handles upgrading http:// requests with a redirect
-https:// {
- tls {
- on_demand
- }
- root /var/www
- rewrite /{host}{uri}
- @forbidden {
- path /.*
- }
- respond @forbidden 404
- file_server
-}
-
-# Refer to the Caddy docs for more information:
-# https://caddyserver.com/docs/caddyfile
-
-# This config based on information at
-# https://caddy.community/t/on-demand-tls-with-dynamic-content-paths/18140
-# checked and corrected with `caddy validate`
-```
-
-I also took ownership of `/var/www` with `chown -R joshua:joshua /var/www` since the webhooks will run as my login account.
-
-### Webhooks
-
-In my home directory I defined two hook scripts:
-
-`~/webhooks/update-pages.sh`
-```bash
-#!/bin/bash
-# parameter 1 is repo name, parameter 2 is clone url
-[[ "$1" == *"/"* ]] && exit 1;
-[[ "$1" == *".."* ]] && exit 1;
-[[ "$1" == *"*"* ]] && exit 1;
-if [ -d "/var/www/$1" ]; then
- cd "/var/www/$1";
- git fetch origin gh-pages;
- git reset --hard origin/gh-pages;
- exit;
-fi;
-git clone -b gh-pages --single-branch "$2" "$1" || exit 1;
-```
-
-`~/webhooks/remove-pages.sh`
-```bash
-#!/bin/bash
-# parameter 1 is repo name
-[[ "$1" == *"/"* ]] && exit 1;
-[[ "$1" == *".."* ]] && exit 1;
-[[ "$1" == *"*"* ]] && exit 1;
-[ -d "/var/www/$1" ] || exit 1;
-cd "/var/www";
-rm -rf "/var/www/$1";
-```
-
-To trigger these hooks I am using `webhook` which is in the default Debian repository.
-
-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 `uuidgen -r` to create mine. Save these values so you can enter them in Forgejo later.
-
-Also make sure to replace your execute-command lines with ones referencing your username and script paths.
-
-`/etc/webhook.conf`
-```json
-[
- {
- "id": "update-pages",
- "execute-command": "/usr/bin/sudo",
- "pass-arguments-to-command":
- [
- { "source": "string", "name": "-u"},
- { "source": "string", "name": "joshua"},
- { "source": "string", "name": "/home/joshua/webhooks/update-pages.sh"},
- { "source": "payload", "name": "repository.name" },
- { "source": "payload", "name": "repository.clone_url" }
- ],
- "trigger-rule":
- {
- "and":
- [
- {
- "match":
- {
- "type": "payload-hmac-sha256",
- "secret": "(omitted)",
- "parameter":
- {
- "source": "header",
- "name": "X-Forgejo-Signature"
- }
- }
- },
- {
- "match":
- {
- "type": "value",
- "value": "refs/heads/gh-pages",
- "parameter":
- {
- "source": "payload",
- "name": "ref"
- }
- }
- }
- ]
- }
- },
- {
- "id": "remove-pages",
- "execute-command": "/usr/bin/sudo",
- "pass-arguments-to-command":
- [
- { "source": "string", "name": "-u"},
- { "source": "string", "name": "joshua"},
- { "source": "string", "name": "/home/joshua/webhooks/remove-pages.sh"},
- { "source": "payload", "name": "repository.name" }
- ],
- "trigger-rule":
- {
- "and":
- [
- {
- "match":
- {
- "type": "payload-hmac-sha256",
- "secret": "(omitted)",
- "parameter":
- {
- "source": "header",
- "name": "X-Forgejo-Signature"
- }
- }
- }
- ]
- }
- }
-]
-```
-
-### Forgejo
-
-Forgejo supports running webhooks conditionally triggered by certain conditions.
-Under my main user settings I set up each webhook:
-
-#### Update pages
-
-Target URL: https:// _your domain here_ /hooks/update-pages
-HTTP Method: `POST` (the default)
-POST content type: `application/json` (the default)
-Secret: _omitted, use your own_
-Trigger on: Push events
-Branch filter: `gh-pages`
-
-#### Remove pages
-
-Target URL: https:// _your domain here_ /hooks/remove-pages
-HTTP Method: `POST` (the default)
-POST content type: `application/json` (the default)
-Secret: _omitted, use your own_
-Trigger on: Custom Events > Repository > Delete
-Branch filter: `gh-pages`
-
-## Conclusion
-
-It works!
-Here is [the marklink repo in my Forgejo instance](https://git.apps.seigler.net/joshua/marklink.pages.seigler.net) and [its contents on my Caddy server](https://marklink.pages.seigler.net/).
-
-That repo is just HTML and JS with only a gh-pages branch, but for repos with npm build scripts, I use [gh-pages @ npm](https://www.npmjs.com/package/gh-pages) to push the build to a gh-pages branch and up to the server.
-
-I'm putting off rolling my own CI server, but I imagine that's the next stage here. Stay tuned.
\ No newline at end of file
diff --git a/site/posts/2025-06-21-war/index.md b/site/posts/2025-06-21-war/index.md
deleted file mode 100644
index b8e7a20..0000000
--- a/site/posts/2025-06-21-war/index.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-title: War
-slug: july-21-2025
-description: Lord, have mercy.
-tags:
- - zeitgeist
- - faith
----
-
-Today the USA announced its bombing of three locations in Iran, including Iran's main nuclear enrichment site, located under a mountain in Fordow. How far will things go?
-
-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^[Quote copied from [St. Nectarios Monastery](https://www.stnektariosmonastery.org/repentance-and-confession/This%20Life%20Has%20Been%20Given%20to%20Us%20for%20Repentance%20-%20St.%20Isaac%20the%20Syrian.pdf) and [OrthodoxWiki](https://orthodoxwiki.org/Isaac_of_Syria)]:
-
-
-
-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.
-
-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.
-
-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.
-
-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: _"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)_.
-
-
-
-May we not be tested beyond what we can bear, and may we have indestructible peace that is not of this world.
\ No newline at end of file
diff --git a/site/posts/2025-06-26-ffmpeg-audio-cleanup/index.md b/site/posts/2025-06-26-ffmpeg-audio-cleanup/index.md
deleted file mode 100644
index 0aa7b2d..0000000
--- a/site/posts/2025-06-26-ffmpeg-audio-cleanup/index.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-title: FFmpeg audio cleanup
-description: A script to apply dynamic compression and noise reduction to audio files
-date: 2025-06-26
-slug: ffmpeg-audio-cleanup
-tags:
- - technical
- - ffmpeg
----
-
-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.
-
-Although I could do it easily with [Tenacity](https://tenacityaudio.org/) I didn't want to use a manual process, since it would take days. So I tried using FFmpeg filters and Bash scripting.
-
-I found an FFmpeg filter called [compand](https://ffmpeg.org/ffmpeg-filters.html#compand) which lets you map an input decibel range to an output decibel range. I also used the [anlmdn](https://ffmpeg.org/ffmpeg-filters.html#anlmdn) filter to reduce noise, and the [highpass](https://ffmpeg.org/ffmpeg-filters.html#highpass) filter to help with clarity.
-
-I ran into a couple gotchas.
-
-1. `mpv` does something special for audio playback that prevents audio from clipping. `vlc` plays the file as it is.
-2. 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 `delay` parameter with half the duration of the attack length fixed this.
-
-Here is the script:
-
-`process-audio.sh`
-```bash
-#!/bin/bash
-if [ "$#" == "0" ]; then
- echo "Error: no arguments provided."
- echo "Usage: $0 file1 file2 file3 ..."
- echo "or $0 *.ext"
- exit 1
-fi
-
-trap "exit" INT
-
-while [ "$#" != "0" ]; do
- path="${1%/*}"
- file="${1##*/}"
- outfile="./normalized--$file"
- if [ ! -f "$outfile" ]; then
- echo "Processing $1"
- ffmpeg -i "$1" -v warning -ac 1 -af "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" -threads 4 "$outfile"
- else
- echo "Skipping $1, already processed."
- fi
- shift
-done
-```
-
-If this is useful to you please leave a comment or send an email, I would love to hear about it.
\ No newline at end of file
diff --git a/site/posts/2025-06-28-bananagrams-variant/index.md b/site/posts/2025-06-28-bananagrams-variant/index.md
deleted file mode 100644
index 67a72a3..0000000
--- a/site/posts/2025-06-28-bananagrams-variant/index.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-title: Alternate rules for Bananagrams
-description:
-date: 2025-06-28
-tags:
- - boardgames
----
-
-Digging through old bookmarks I found this alternate ruleset for Bananagrams I want to share:
-
-> 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.
->
-> 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.
->
-> 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.
->
-> 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.
->
-> 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.
-
-Reproduced with light editing from [Houserule Jay @ BoardGameGeek](https://boardgamegeek.com/thread/563175/article/5516061#5516061)
\ No newline at end of file
diff --git a/site/posts/posts.11tydata.js b/site/posts/posts.11tydata.js
deleted file mode 100644
index 4f5c77d..0000000
--- a/site/posts/posts.11tydata.js
+++ /dev/null
@@ -1,19 +0,0 @@
-export default {
- layout: "post.njk",
- permalink: "/posts/{{ slug | default:title | slugify }}/",
- tags: ["posts"],
- author: "Joshua Seigler",
- eleventyComputed: {
- date: "{{ page.date }}",
- slug: "{{ page.slug }}",
- keywords: (data) => data.tags.join(", "),
- permalink: (data) => {
- if (process.env.ELEVENTY_RUN_MODE !== "build") return data.permalink;
- else return data.draft ? false : data.permalink;
- },
- eleventyExcludeFromCollections: (data) => {
- if (process.env.ELEVENTY_RUN_MODE !== "build") return false;
- else return data.draft ?? false;
- },
- },
-};
diff --git a/site/recipes/amish-egg-noodles.md b/site/recipes/amish-egg-noodles.md
deleted file mode 100644
index 798ccdf..0000000
--- a/site/recipes/amish-egg-noodles.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-title: Amish Egg Noodles
-description: Easy chicken-noodle style dish with egg noodles and butter
-date: 2025-06-13
----
-
-## Ingredients
-- 6 tablespoons butter, divided
-- 28 ounces chicken broth
-- 1 chicken bouillon cube
-- 12 ounces extra wide egg noodles
-- 1 teaspoon parsley flakes
-- Salt and pepper, to taste
-## Instructions
-- In a large pan, brown two tablespoons of butter over medium heat.
-- Pour the chicken stock and bouillon cube into the pan and bring to a boil.
-- Add the egg noodles to the chicken stock and return to a boil. Cover the pot and remove from the heat.
-- Let the noodles set for 30 minutes, stirring every 10 minutes or so.
-- 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.
-- Top with the remaining 4 tablespoons of butter, parsley, and salt and pepper to taste.
-- 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.
-
-## Notes
-We use 4.5 tsp of Better than Bouillon with 28oz water, replacing the broth and bouillon cube.
-We also usually brown some canned chicken and add it at the same time as the butter and seasonings.
-
-Original recipe from [bunsinmyoven](https://www.bunsinmyoven.com/amish-egg-noodles/)
-
-## Nutrition Information
-Makes 6 servings. Each serving:
-**Calories** 328kcal (16%), **Total Fat** 14g (22%), Saturated Fat 7g (44%), Cholesterol 77mg (26%), **Sodium** 758mg (33%), **Total Carbohydrates** 41g (14%), Dietary Fiber 2g (8%), Sugar 1g (1%), **Protein** 9g (18%), **Vitamin C** 10.3mg (12%), **Vitamin A** 400IU (8%), **Iron** 1.5mg (8%), **Calcium** 41mg (4%), **Potassium** 266mg (8%)
\ No newline at end of file
diff --git a/site/recipes/chicken-chili-verde.md b/site/recipes/chicken-chili-verde.md
deleted file mode 100644
index ed8c1a5..0000000
--- a/site/recipes/chicken-chili-verde.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-title: Chicken Chili Verde
-description: Fresh and mildly spicy mexican style chicken over rice
-date: 2025-07-01
----
-Serves six. Prep 20 minutes, cooking time about 1 hour. Mildly spicy. Requires an immersion blender or kitchen blender.
-
-## Ingredients
-- 1-3 jalapeño peppers
-- 1 Anaheim or Cubanelle pepper
-- 6 tomatillos
-- 2 large chicken breasts
-- 1 large white onion
-- 1 head of garlic
-- 3 cups chicken stock
-- 2 tsp neutral oil
-- Salt
-- Pepper
-- 1 lime
-- 1 tsp oregano
-- Fresh cilantro, optional
-- 3 cups white rice
-
-## Directions
-1. Rough chop the onion. Dice a little bit and set aside for a garnish.
-2. 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.
-3. While that cooks, deseed the peppers.
-4. 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.
-5. Set aside the seared veggies. Cook the rice by your preferred method.
-6. When the chicken is done simmering, remove the breasts and add the broth, onions, etc to the veggies.
-7. Add to the mixture half the lime juice, and salt, pepper, oregano, and cilantro.
-8. Blend until very smooth.
-9. Shred the chicken breasts with forks and add to the mixture.
-10. Heat the mixture, covered, over medium heat for 15 minutes.
-11. Serve over rice and garnish with diced onion and lime juice.
-
-## Notes
-You can use jarred minced garlic instead of fresh, just delay adding it when you char the veggies because it will burn easily.
-Original recipe from [Kevin Ashton](https://www.tiktok.com/@oldscoolkevmo/video/7520712000826133791).
-
-## Nutrition Information
-Makes 6 389g servings. Each serving: **Calories**: 558kcal (26%), **Protein**: 28.18g (52%), **Total Fat**: 11.64g (24%), Cholesterol: 64mg, Saturated Fat: 3g, Trans Fat: 0.11g, **Carbohydrates**: 82.35g (34%), Dietary Fiber: 3.9g (16%), Sugars: 3.11g, **Calcium**: 45mg (5%), **Iron**: 2.72mg (15%), **Potassium**: 474mg (10%), **Sodium**: 584mg (39%)
\ No newline at end of file
diff --git a/site/recipes/corn-casserole.md b/site/recipes/corn-casserole.md
deleted file mode 100644
index 0a16b03..0000000
--- a/site/recipes/corn-casserole.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-title: Corn Casserole
-description: An easy sweet cornbread casserole with a vegan variation
-date: 2025-04-24
----
-
-## Ingredients
-
-- 1 can of corn drained
-- 1 can of creamed corn
-- 1 stick melted butter 1/2 cup
-- 1 box of Jiffy Corn Muffin mix
-- 1 cup sour cream
-
-## Instructions
-
-1. Preheat the oven to 350 degrees.
-2. In a bowl, mix all of the ingredients together in order, then pour into a greased 8"x8" baking pan.
-3. Cook uncovered for 45-50 minutes or until lightly browned.
-
-## Notes
-
-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.
-
-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.
-
-## Nutrition Information
-
-Makes 15.5 100g servings. Each serving: **Calories**: 167g (8%), **Protein**: 2.82g (5%), **Total Fat**: 9.35g (19%), Cholesterol: 31g, Saturated Fat: 5.2g, Trans Fat: 0.24g, **Carbohydrates**: 20g (8%), Dietary Fiber: 1.1g (4%), Sugars: 2.05g, **Calcium**: 36mg (4%), **Iron**: 0.6mg (3%), **Potassium**: 137mg (3%), **Sodium**: 346mg (23%)
\ No newline at end of file
diff --git a/site/recipes/creamy-chicken-orzo.md b/site/recipes/creamy-chicken-orzo.md
deleted file mode 100644
index 0691260..0000000
--- a/site/recipes/creamy-chicken-orzo.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: Creamy Chicken Orzo
-description: Rich and comforting chicken and pasta dish
-date: 2025-05-20
----
-
-## Ingredients
-- 2 boneless skinless chicken breasts, cooked and diced
-- 8 ounces Orzo pasta
-- 2 celery stalks, finely diced
-- 2 carrots, finely diced
-- 1/2 yellow onion, finely diced
-- 5 tablespoons butter
-- 2 tablespoons olive oil
-- 2 cups chicken broth
-- ½ cup heavy whipping cream
-- 1 teaspoon chicken bouillon powder
-- 1/3 cup all purpose flour
-
-## Instructions
-
-1. Cook the Orzo per the package instructions.
-2. While that cooks, make a mirepoix:
- 1. In a large skillet over medium high heat add the butter and olive oil.
- 2. Once the butter is melted add in the diced onion, carrots and celery.
- 3. Allow the veggies to sauté for 4-5 minutes until they start to soften up.
-3. 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.
-4. 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.
-5. 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 & enjoy!
-
-## Notes
-
-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.
-
-Original recipe from [Cooking with Katie Cross](https://cookingwithkatiecross.com/creamy-chicken-pot-pie-orzo/)
-
-## Nutrition Information
-
-Makes 5 servings, 1700g. Each 340g serving:
-**Calories** 496kcal (25%), **Total Fat** 21g (32%), Saturated Fat 9g (45%), Trans Fat 0g, **Cholesterol** 102mg (34%), **Sodium** 504mg (21%), **Total Carbohydrates** 45g (15%), Dietary Fiber 3g (13%), Sugars 3g, **Protein** 30g (60%), **Vitamin A** 4646IU, **Vitamin C** 3mg, **Calcium** 78mg, **Iron** 2mg, **Potassium** 442mg
diff --git a/site/recipes/luther-salad.md b/site/recipes/luther-salad.md
deleted file mode 100644
index 0d579b3..0000000
--- a/site/recipes/luther-salad.md
+++ /dev/null
@@ -1,41 +0,0 @@
----
-title: Luther Salad
-description: Simple italian pasta salad
-date: 2025-05-05
----
-
-## Ingredients
-
-- 1 lb tri-color rotini
-- italian dressing
-- extras
- - cubed low-moisture mozzarella
- - frozen peas
- - shredded chicken
-
-## Instructions
-
-1. Cook rotini in well salted water according to box directions. While rotini cooks, prepare your extras.
-2. Drain pasta and rinse twice in cold water to remove starch and stop carryover cooking.
-3. In a large bowl combine rotini and extras. Add italian dressing, at least 8 oz. Mix and serve or refrigerate.
-
-## Notes
-
-At first we called this "worm salad" but this proved off-putting, and we needed a new name. We had recently learned about the [1521 Diet of Worms](https://en.wikipedia.org/wiki/Diet_of_Worms) where Martin Luther was summoned to defend or recant his beliefs, so we called it "Luther salad" instead.
-
-The base salad already covers elements of [salt, fat, acid, and heat](https://www.saltfatacidheat.com/), so your extras are mostly for texture, leaving lots of room for variations:
-
-### Vegan / healthy:
-- halved cherry tomatoes
-- slivered sweet peppers
-- paysanne cucumber
-
-### Italian:
-- halved cherry tomatoes
-- sliced black olives, drained
-- cubed cheese
-- chopped pepperoni
-
-## Nutrition Information
-
-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.
\ No newline at end of file
diff --git a/site/recipes/pasta-rosatella.md b/site/recipes/pasta-rosatella.md
deleted file mode 100644
index e471569..0000000
--- a/site/recipes/pasta-rosatella.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-title: Pasta Rosatella
-description: Cheap, rich, and easy pasta
-date: 2025-05-20
----
-
-## Ingredients
-
-- 1lb any pasta
-- 2 cups (approximate) garlic & herb pasta sauce
-- 1½ cups milk
-- 2 tablespoons flour
-- 2 tablespoons oil
-- Salt and pepper
-- Grated Parmesan cheese
-
-## Instructions
-
-1. Cook the pasta according to the package directions.
-2. Meanwhile in a saucepan, whisk together the oil and flour over medium heat to form a roux. Cook for 1–2 minutes until lightly golden.
-3. Slowly whisk in the milk to make a béchamel and continue stirring until thickened.
-4. Season with salt and pepper, and add cheese.
-5. Stir in the pasta sauce and let the mixture simmer on low.
-6. When the pasta is done cooking, drain it, then top with the sauce and extra cheese to serve.
-
-## Notes
-
-The recipe works the same with almond milk and vegan mozarella replacing the existing dairy.
-
-Original recipe from [dollartreedinners](https://www.tiktok.com/@dollartreedinners/video/7499238134434123051)
-
-## Nutrition Information
-Makes 4 servings. Each serving:
-**Calories** 626kcal (31%) **Total Fat** 14.1g (18%) **Saturated Fat** 4.4g (22%) **Trans Fat** 0.19g **Cholesterol** 18.1mg (6%) **Sodium** 980.9mg (41%) **Total Carbohydrate** 100g (36%) **Dietary Fiber** 4.8g (17%) **Total Sugars** 10.7g (21%) **Protein** 22.8g (46%) **Vitamin C** 2.6mg (3%) **Vitamin D** 1.2mcg (6%) **Iron** 4.8mg (27%) **Calcium** 242.6mg (19%) **Potassium** 642.7mg (14%) **Phosphorus** 381.7mg (31%)
\ No newline at end of file
diff --git a/site/recipes/perfect-homemade-brownies.md b/site/recipes/perfect-homemade-brownies.md
deleted file mode 100644
index 2481d81..0000000
--- a/site/recipes/perfect-homemade-brownies.md
+++ /dev/null
@@ -1,33 +0,0 @@
----
-title: Perfect Homemade Brownies
-description: Decadent brownies made from scratch
-date: 2025-05-20
----
-
-## Ingredients
-- 1 cup butter
-- 2 1/4 cups sugar
-- 4 large eggs
-- 1 1/4 cups cocoa powder
-- 1 teaspoon salt
-- 1 teaspoon baking powder
-- 1 teaspoon espresso powder (optional)
-- 1 tablespoon vanilla extract
-- 1 1/2 cups all-purpose flour
-- 2 cups semi-sweet chocolate chips
-
-## Instructions
-
-1. Pre-heat the oven to 350 degrees. Butter a 9×13 baking dish.
-2. 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.
-3. 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.
-4. Stir in the flour and chocolate chips until well combined.
-5. 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.
-
-## Notes
-
-Original recipe from [Buns In My Oven](https://www.bunsinmyoven.com/good-ol-homemade-brownies/)
-
-## Nutrition Information
-
-16 servings. Each serving: **Calories** 419kcal (21%) **Carbohydrates** 53g (18%) **Protein** 5g (10%) **Fat** 22g (34%) **Saturated Fat** 13g (81%) **Cholesterol** 78mg (26%) **Sodium** 268mg (12%) **Potassium** 290mg (8%) **Fiber** 4g (17%) **Sugar** 36g (40%) **Vitamin A** 435IU (9%) **Calcium** 46mg (5%) **Iron** 3.2mg (18%)
diff --git a/site/recipes/recipes.11tydata.js b/site/recipes/recipes.11tydata.js
deleted file mode 100644
index ab40955..0000000
--- a/site/recipes/recipes.11tydata.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export default {
- layout: "post.njk",
- tags: ["recipes"],
- omitMetadata: true,
- omitTOC: true,
-};
diff --git a/site/recipes/sloppy-joes.md b/site/recipes/sloppy-joes.md
deleted file mode 100644
index fdbc24d..0000000
--- a/site/recipes/sloppy-joes.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-title: Sloppy Joes
-description: A summertime favorite, great over hot dogs
-date: 2024-06-07
----
-## Ingredients
-
-- 1 lb. hamburger
-- 1/2 teaspoon paprika
-- 1 teaspoon chili powder
-- 1 Tablespoon dry mustard
-- 1 Tablespoon parsley, chopped
-- 1 Tablespoon Worcestershire sauce
-- 2 Tablespoons brown sugar
-- 2 Tablespoons apple cider vinegar
-- 1/2 cup onion, diced
-- 1/2 cup Ketchup
-- 1 cup water
-
-## Instructions
-
-1. Brown beef with onion, draining fat.
-1. Add all remaining ingredients and bring to a boil.
-1. Simmer 20 minutes or until thickened, stirring occasionally.
-1. Refrigerate overnight, serve hot.
-
-## Notes
-
-If you don't have onion you can substitute 1/2 tablespoon onion powder.
-Recipe originally from Connie Henderson of Charlottesville, VA
-
-## Nutrition Information
-
-Makes 9.5 100g servings. Each serving: **Calories**: 135 kcal (6%), **Fat**: 7.43g (15%), Cholesterol: 32 mg, Saturated Fat: 2.738g, Trans Fat: 0.408g, **Carbohydrates**: 7.62g (3%), Fiber: 0.4g (2%), Sugars: 5.99g, **Protein**: 9.26g (17%), **Vitamin C**: 1.8mg (2%), **Vitamin A**: 253 IU 1(1%), **Vitamin D**: 1 IU (0%)
\ No newline at end of file
diff --git a/site/recipes/spanish-style-rice.md b/site/recipes/spanish-style-rice.md
deleted file mode 100644
index 4a04203..0000000
--- a/site/recipes/spanish-style-rice.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-title: Spanish Style Rice
-description: One-pan restaurant style spanish rice
-date: 2025-05-05
----
-
-## Ingredients
-
-- 3 Tbsp neutral oil
-- 2 cups long grain white rice
-- 4 cups water
-- 8 oz tomato sauce
-- 2 Tbsp chicken or vegetable bouillon powder
-- 1.5 cups water
-
-## Instructions
-
-1. Add oil to a large frying pan over medium-high heat.
-2. Add uncooked rice, stirring continually until rice is toasted.
-3. Stir in 4 cups water, tomato sauce, and bouillon.
-4. Return to boil and leave uncovered **10 minutes**.
-5. Stir in 1.5 cups water and return to a boil.
-6. Reduce heat to low and cover. Simmer **10 minutes**.
-7. Turn off heat and leave in place, covered for **20 minutes**.
-
-Enjoy!
-
-## Notes
-
-Original recipe from [dollartreedinners](https://www.tiktok.com/t/ZT2Qy1AtF/)
-
-## Nutrition Information
-
-Makes 4 servings. Each serving: **Calories** 441kcal (22%), **Total Fat** 11.3g (17%), Saturated Fat 1.9g (10%), Trans Fat 0.1g, Cholesterol 1mg (0%), **Sodium** 56mg (2%), **Total Carbohydrates** 76g (25%), Dietary Fiber 2g (6%), Sugars 0g, **Protein** 7g, **Vitamin A** (1%), **Vitamin C** (9%), **Calcium** (7%), **Iron** (24%)
\ No newline at end of file
diff --git a/site/sitemap.njk b/site/sitemap.njk
deleted file mode 100644
index e26a01d..0000000
--- a/site/sitemap.njk
+++ /dev/null
@@ -1,15 +0,0 @@
----
-permalink: /assets/sitemap.xml
-eleventyExcludeFromCollections: true
----
-
-
- {%- for page in collections.all -%}
- {%- if not page.data.draft and page.url %}
-
- {{ site.url }}{{ page.url | url }}
- {{ page.date.toISOString() }}
-
- {%- endif -%}
- {%- endfor %}
-
diff --git a/site/timeline/1983.md b/site/timeline/1983.md
deleted file mode 100644
index 470f6b5..0000000
--- a/site/timeline/1983.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-title: Hello World
-time: 1983
----
diff --git a/site/timeline/1985-1998.md b/site/timeline/1985-1998.md
deleted file mode 100644
index d57b7c0..0000000
--- a/site/timeline/1985-1998.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Homeschooled
-time: 1985-1998
-description: |
- Reading, field trips, spelling bees. Developing interest in math, art, and computers. As long as I stayed ahead of the baseline public school standards, I could explore whatever interested me. What a great beginning.
- Big thanks to my parents for nurturing my appetite for learning. Thanks also to my brothers for teaching me patience and conflict resolution!
----
diff --git a/site/timeline/1998.md b/site/timeline/1998.md
deleted file mode 100644
index e8d742f..0000000
--- a/site/timeline/1998.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: First community college course
-time: 1998
-description: |
- "Calculus with Analytic Geometry I". I showed my teacher a Newton's method root-finder program I made for my TI-83 calculator, and at the end of class she surprised me by having me demonstrate it to the class. When I asked why she hadn't given me any warning, she asked, "Would that have made you less nervous?"
----
diff --git a/site/timeline/1999-2001.md b/site/timeline/1999-2001.md
deleted file mode 100644
index 2dbae4b..0000000
--- a/site/timeline/1999-2001.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: |
- [PVCC](https://www.pvcc.edu/) - Associate’s in science
-time: 1999-2001
-description: |
- Highlights include a public speaking class and an excellent Java programming class, my introduction to object-oriented programming. I have such fond memories of the teachers here and their dedicated enthusiasm.
----
diff --git a/site/timeline/2001-2004.md b/site/timeline/2001-2004.md
deleted file mode 100644
index cf9233c..0000000
--- a/site/timeline/2001-2004.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: |
- [RPI](https://www.rpi.edu/) - Bachelor’s in Math & Computer Science
-time: 2001-2004
-description: |
- My first time living away from home. Aside from the education, I connected with a lot of people who have remained important in my life.
----
diff --git a/site/timeline/2004-2008.md b/site/timeline/2004-2008.md
deleted file mode 100644
index 9e71ea4..0000000
--- a/site/timeline/2004-2008.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Part time teacher / E-learning Technician
-time: 2004-2008
-description: |
- After a couple semesters as a part time math instructor at my old community college, I switched to a role supporting instructors with remote learning, software assistance, and classroom technology.
- This is also when my love of board games really exploded. Local friends had an extensive game collection and we used to play until late at night.
----
diff --git a/site/timeline/2008-2010.md b/site/timeline/2008-2010.md
deleted file mode 100644
index 8caa17f..0000000
--- a/site/timeline/2008-2010.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Exploring
-time: 2008-2010
-description: |
- This includes about a year of small-business home computer repair, as well as some valuable time improving my communication skills at a satellite TV tech support center.
----
diff --git a/site/timeline/2010-2013.md b/site/timeline/2010-2013.md
deleted file mode 100644
index a4cf858..0000000
--- a/site/timeline/2010-2013.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: |
- Junior software engineer @ [Oakleaf / Waste Management](https://www.wm.com/)
-time: 2010-2013
-description: |
- This Microsoft based company was a good first step into corporate development. I was exposed to a variety of development roles, and began building a personal specialization in front-end development.
- Also, shortly after moving for this job, I met my wife!
----
diff --git a/site/timeline/2013-2017.md b/site/timeline/2013-2017.md
deleted file mode 100644
index a358375..0000000
--- a/site/timeline/2013-2017.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: |
- Application engineer @ [XPO Logistics](https://www.xpo.com/)
-time: 2013-2017
-description: |
- Microsoft environment, Agile methodology. This fully front-end focused role highlighted the value of investing in myself and building a skillset focused around my strengths and interests.
- Outside of work, I began deeply researching cryptocurrencies and economics and using open source web development tools for personal projects.
----
diff --git a/site/timeline/2017-2020.md b/site/timeline/2017-2020.md
deleted file mode 100644
index 80e775e..0000000
--- a/site/timeline/2017-2020.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: |
- Software developer @ [Dash Core Group](https://www.dash.org/dcg/)
-time: 2017-2020
-description: |
- After some successful freelance work, I became a full time contractor, working remotely. I was fortunate to sometimes travel to interesting places to represent Dash or to meet up worldwide with other developers. My focus here was on web development, React Native app development, and JavaScript API testing and documentation.
----
diff --git a/site/timeline/2020-2021.md b/site/timeline/2020-2021.md
deleted file mode 100644
index d1d5032..0000000
--- a/site/timeline/2020-2021.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Senior software engineer @ [HubSpot](https://www.hubspot.com/)
-time: 2020-2021
-description: |
- Back in the corporate world, using my experience to develop React projects in an agile environment. I began building my mentoring and team management abilities, as well as sharpening my JavaScript and React skills.
----
diff --git a/site/timeline/2021-2022.md b/site/timeline/2021-2022.md
deleted file mode 100644
index 9591656..0000000
--- a/site/timeline/2021-2022.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Senior software engineer @ [Prenda](https://www.prenda.com/)
-time: 2021-2022
-description: |
- This role was at the intersection of many interests, including learning, communication, and decentralized solutions. Here I learned to own, plan, and solve larger and less-well-defined tasks. Prenda has an excellent and intentional culture that fosters humility and recognizes others' humanity.
----
diff --git a/site/timeline/2023-2025.md b/site/timeline/2023-2025.md
deleted file mode 100644
index 39aca64..0000000
--- a/site/timeline/2023-2025.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Founding software engineer @ [Capabuild](https://www.capabuild.app/)
-time: 2022-2025
-description: |
- Capabuild is a web and mobile platform for disaster recovery companies. This role was an unexpectedly great fit for some technologies I used in side projects: THREE.js and SVG. Here I worked with other experienced engineers building new things and continuously balancing speed and sustainability. Startup life is exciting! Priorities can change quickly, and in this role I could see every day how my work and execution could help our customers, and ultimately make the business a success. In this role I learned to accept and also pay down tech debt, and experienced the value of investing time into a good development environment.
----
diff --git a/site/timeline/2025.md b/site/timeline/2025.md
deleted file mode 100644
index 2b17940..0000000
--- a/site/timeline/2025.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Senior Frontend Developer @ [QI Path](https://www.qipath.com/)
-time: 2025-present
-description: |
- QI Path is a startup offering a risk analysis platform. This platform helps decision makers in a variety of industries accurately assess risk, so they can make decisions with an awareness of hidden vulnerabilities and minimize quality and safety issues. This role also re-connects me with a college friend!
----
diff --git a/site/timeline/timeline.11tydata.js b/site/timeline/timeline.11tydata.js
deleted file mode 100644
index 643c813..0000000
--- a/site/timeline/timeline.11tydata.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export default {
- tags: ["timeline"],
- permalink: false,
-};
diff --git a/sitemap.xml b/sitemap.xml
new file mode 100644
index 0000000..3ea00e6
--- /dev/null
+++ b/sitemap.xml
@@ -0,0 +1,187 @@
+
+
+
+ /posts/authority-consents-blind-spot/
+ 2020-07-02T00:00:00.000Z
+
+
+ /posts/the-trivium-a-tool-for-learning-anything/
+ 2021-04-03T00:00:00.000Z
+
+
+ /posts/needs-based-communication/
+ 2021-05-26T00:00:00.000Z
+
+
+ /posts/embracing-mysticism/
+ 2021-10-16T00:00:00.000Z
+
+
+ /posts/finally-a-coherent-worldview/
+ 2023-07-14T00:00:00.000Z
+
+
+ /posts/site-design-updated/
+ 2024-06-05T00:00:00.000Z
+
+
+ /recipes/sloppy-joes/
+ 2024-06-07T00:00:00.000Z
+
+
+ /posts/thinking-machines/
+ 2025-04-24T00:00:00.000Z
+
+
+ /recipes/corn-casserole/
+ 2025-04-24T00:00:00.000Z
+
+
+ /recipes/luther-salad/
+ 2025-05-05T00:00:00.000Z
+
+
+ /recipes/spanish-style-rice/
+ 2025-05-05T00:00:00.000Z
+
+
+ /posts/tools-of-the-trade/
+ 2025-05-15T00:00:00.000Z
+
+
+ /recipes/creamy-chicken-orzo/
+ 2025-05-20T00:00:00.000Z
+
+
+ /recipes/pasta-rosatella/
+ 2025-05-20T00:00:00.000Z
+
+
+ /recipes/perfect-homemade-brownies/
+ 2025-05-20T00:00:00.000Z
+
+
+ /now/
+ 2025-06-07T00:00:00.000Z
+
+
+ /recipes/amish-egg-noodles/
+ 2025-06-13T00:00:00.000Z
+
+
+ /posts/my-very-own-github-pages/
+ 2025-06-15T00:00:00.000Z
+
+
+ /uses/
+ 2025-06-20T00:00:00.000Z
+
+
+ /posts/july-21-2025/
+ 2025-06-21T00:00:00.000Z
+
+
+ /posts/ffmpeg-audio-cleanup/
+ 2025-06-26T00:00:00.000Z
+
+
+ /about/
+ 2025-06-26T23:35:15.838Z
+
+
+ /books/
+ 2025-06-26T23:35:15.838Z
+
+
+ /music/
+ 2025-06-26T23:35:15.838Z
+
+
+ /posts/
+ 2025-06-26T23:35:15.838Z
+
+
+ /recipes/
+ 2025-06-26T23:35:15.838Z
+
+
+ /search/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/pages/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/ethos/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/learning/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/how-to/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/communication/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/faith/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/technical/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/zeitgeist/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/ai/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/software/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/selfhosting/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/ffmpeg/
+ 2025-06-26T23:35:15.839Z
+
+
+ /tags/boardgames/
+ 2025-06-26T23:35:15.839Z
+
+
+ /unoffice-hours/
+ 2025-06-26T23:35:15.839Z
+
+
+ /webrings/
+ 2025-06-26T23:35:15.839Z
+
+
+ /posts/alternate-rules-for-bananagrams/
+ 2025-06-28T00:00:00.000Z
+
+
+ /links/
+ 2025-06-29T00:39:27.806Z
+
+
+ /recipes/chicken-chili-verde/
+ 2025-07-01T00:00:00.000Z
+
+
+ /
+ 2025-07-05T03:42:14.909Z
+
+
diff --git a/tags/ai/index.html b/tags/ai/index.html
new file mode 100644
index 0000000..673b41e
--- /dev/null
+++ b/tags/ai/index.html
@@ -0,0 +1 @@
+Posts tagged #ai - joshua.seigler.net
The computers will start thinking, and people will stop.
\ No newline at end of file
diff --git a/tags/boardgames/index.html b/tags/boardgames/index.html
new file mode 100644
index 0000000..fa95216
--- /dev/null
+++ b/tags/boardgames/index.html
@@ -0,0 +1 @@
+Posts tagged #boardgames - joshua.seigler.net
\ No newline at end of file
diff --git a/tags/communication/index.html b/tags/communication/index.html
new file mode 100644
index 0000000..155b64f
--- /dev/null
+++ b/tags/communication/index.html
@@ -0,0 +1 @@
+Posts tagged #communication - joshua.seigler.net
How to connect with others through shared human needs.
\ No newline at end of file
diff --git a/tags/ethos/index.html b/tags/ethos/index.html
new file mode 100644
index 0000000..51e5a0c
--- /dev/null
+++ b/tags/ethos/index.html
@@ -0,0 +1 @@
+Posts tagged #ethos - joshua.seigler.net
Authority is the idea that certain people are justified in violating consent. This belief allows people to force others to do what they want with a clear conscience.
\ No newline at end of file
diff --git a/tags/faith/index.html b/tags/faith/index.html
new file mode 100644
index 0000000..c95c711
--- /dev/null
+++ b/tags/faith/index.html
@@ -0,0 +1 @@
+Posts tagged #faith - joshua.seigler.net
Society is moving from a materialistic era into a mystical one. I describe my attempt to gain mystical proficiency.
\ No newline at end of file
diff --git a/tags/ffmpeg/index.html b/tags/ffmpeg/index.html
new file mode 100644
index 0000000..06c4efa
--- /dev/null
+++ b/tags/ffmpeg/index.html
@@ -0,0 +1 @@
+Posts tagged #ffmpeg - joshua.seigler.net
A script to apply dynamic compression and noise reduction to audio files
\ No newline at end of file
diff --git a/tags/how-to/index.html b/tags/how-to/index.html
new file mode 100644
index 0000000..1fd668a
--- /dev/null
+++ b/tags/how-to/index.html
@@ -0,0 +1 @@
+Posts tagged #how to - joshua.seigler.net
An ancient methodology for learning, which formed the basis of classical education in the Middle Ages and Rennaisance.
\ No newline at end of file
diff --git a/tags/learning/index.html b/tags/learning/index.html
new file mode 100644
index 0000000..f30e88a
--- /dev/null
+++ b/tags/learning/index.html
@@ -0,0 +1 @@
+Posts tagged #learning - joshua.seigler.net
An ancient methodology for learning, which formed the basis of classical education in the Middle Ages and Rennaisance.
\ No newline at end of file
diff --git a/tags/pages/index.html b/tags/pages/index.html
new file mode 100644
index 0000000..7abd626
--- /dev/null
+++ b/tags/pages/index.html
@@ -0,0 +1 @@
+Posts tagged #pages - joshua.seigler.net
\ No newline at end of file
diff --git a/tags/selfhosting/index.html b/tags/selfhosting/index.html
new file mode 100644
index 0000000..3248eb5
--- /dev/null
+++ b/tags/selfhosting/index.html
@@ -0,0 +1 @@
+Posts tagged #selfhosting - joshua.seigler.net
How to self-host Forgejo and automatically serve your web build branches with SSL.
\ No newline at end of file
diff --git a/tags/software/index.html b/tags/software/index.html
new file mode 100644
index 0000000..8f825cb
--- /dev/null
+++ b/tags/software/index.html
@@ -0,0 +1 @@
+Posts tagged #software - joshua.seigler.net
\ No newline at end of file
diff --git a/tags/technical/index.html b/tags/technical/index.html
new file mode 100644
index 0000000..773d020
--- /dev/null
+++ b/tags/technical/index.html
@@ -0,0 +1 @@
+Posts tagged #technical - joshua.seigler.net
\ No newline at end of file
diff --git a/tags/zeitgeist/index.html b/tags/zeitgeist/index.html
new file mode 100644
index 0000000..cb9db79
--- /dev/null
+++ b/tags/zeitgeist/index.html
@@ -0,0 +1 @@
+Posts tagged #zeitgeist - joshua.seigler.net
Working remotely has a lot of benefits, but we miss out on the serendipitous connections and socialization that happened just from being in the same room. Unoffice hours is part of an attempt to make new connections, but without applying the giant invisible filter of my own preferences.
We could do some pair programming, talk about tech, life, matters of aesthetics or philosophy - the point is serendipity. If you want to call with no agenda, that’s fine too, we can just get to know each other.
The idea of unoffice hours comes from Matt Webb. This site is part of an Unoffice Hours Webring with other bloggers who have picked it up.
\ No newline at end of file
diff --git a/uses/index.html b/uses/index.html
new file mode 100644
index 0000000..a6619f6
--- /dev/null
+++ b/uses/index.html
@@ -0,0 +1 @@
+What I Use - joshua.seigler.net
\ No newline at end of file
diff --git a/webrings/index.html b/webrings/index.html
new file mode 100644
index 0000000..5615b26
--- /dev/null
+++ b/webrings/index.html
@@ -0,0 +1 @@
+Webrings - joshua.seigler.net
Sites with a dark theme.
\ No newline at end of file
diff --git a/xf0iDxB-MD-1152-jryTDRGR.jpeg b/xf0iDxB-MD-1152-jryTDRGR.jpeg
new file mode 100644
index 0000000..a0cc3a7
Binary files /dev/null and b/xf0iDxB-MD-1152-jryTDRGR.jpeg differ
diff --git a/xf0iDxB-MD-1152-yCyddgLQ.avif b/xf0iDxB-MD-1152-yCyddgLQ.avif
new file mode 100644
index 0000000..88a3c32
Binary files /dev/null and b/xf0iDxB-MD-1152-yCyddgLQ.avif differ
diff --git a/xf0iDxB-MD-1470-BQsuG7_e.avif b/xf0iDxB-MD-1470-BQsuG7_e.avif
new file mode 100644
index 0000000..24f112a
Binary files /dev/null and b/xf0iDxB-MD-1470-BQsuG7_e.avif differ
diff --git a/xf0iDxB-MD-1470-ZULa8S1g.jpeg b/xf0iDxB-MD-1470-ZULa8S1g.jpeg
new file mode 100644
index 0000000..0230927
Binary files /dev/null and b/xf0iDxB-MD-1470-ZULa8S1g.jpeg differ
diff --git a/xf0iDxB-MD-384-DlZZ2V67.avif b/xf0iDxB-MD-384-DlZZ2V67.avif
new file mode 100644
index 0000000..186b096
Binary files /dev/null and b/xf0iDxB-MD-384-DlZZ2V67.avif differ
diff --git a/xf0iDxB-MD-384-NbbNBVlU.jpeg b/xf0iDxB-MD-384-NbbNBVlU.jpeg
new file mode 100644
index 0000000..677c578
Binary files /dev/null and b/xf0iDxB-MD-384-NbbNBVlU.jpeg differ