joshua.seigler.net Personal homepage of Joshua Seigler 2025-06-15T00:00:00Z https://joshua.seigler.net/ Joshua Seigler 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-result" tabindex="-1"> <a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#the-result" aria-hidden="true" ></a> The result </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, 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 &quot;WWW Full&quot;</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 domains names and the email. Email could be removed, but it is recommended so SSL certificate issues can contact you if there is a problem with your certificates. </p> <p><code>/etc/caddy/Caddyfile</code></p> <pre><code># Global options block { email you@example.com # &lt;&lt;&lt;&lt; change this on_demand_tls { ask http://localhost/check } } omitted.webhooks.subdomain.tld { # &lt;&lt;&lt;&lt; change this reverse_proxy localhost:9000 } http://localhost { handle /check { root * /var/www @deny not file /{query.domain}/ respond @deny 404 } } https:// { tls { on_demand } root /var/www rewrite /{host}{uri} # Block files that start with a . @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` </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="webhook" tabindex="-1"> <a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#webhook" aria-hidden="true" ></a> Webhook </h3> <p> I altered the systemd service definition for <code>webhook</code> so I could organize the hook definitions into separate files. I also set <code>User=joshua</code> and <code>Group=joshua</code> so the commands run as my user instead of root. </p> <p><code>sudo mkdir /etc/webhook.conf.d/</code></p> <p><code>/lib/systemd/system/webhook.service</code></p> <pre><code class="language-ini">[Unit] Description=Small server for creating HTTP endpoints (hooks) Documentation=https://github.com/adnanh/webhook/ ConditionPathExists=/etc/webhook.conf [Service] ExecStart=/usr/bin/webhook -nopanic -hooks /etc/webhook.conf.d/*.conf User=joshua Group=joshua [Install] WantedBy=multi-user.target </code></pre> <p> If you are debugging your webhook output, consider adding <code>-debug</code> next to <code>-nopanic</code> for more useful logs. </p> <p> After changing the service definition, reload systemd to run the updated service: </p> <pre><code class="language-bash">sudo systemctl daemon-reload </code></pre> <p>Then you can remove the now-unused config file:</p> <pre><code class="language-bash">sudo rm /etc/webhook.conf </code></pre> <p>Here are the three hook definitions:</p> <h4 id="create-pages" tabindex="-1"> <a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#create-pages" aria-hidden="true" ></a> Create pages </h4> <p><code>/etc/webhook.conf.d/create-pages.conf</code></p> <pre><code class="language-json">[ { &quot;id&quot;: &quot;create-pages&quot;, &quot;execute-command&quot;: &quot;/home/joshua/webhooks/create-pages.sh&quot;, &quot;command-working-directory&quot;: &quot;/var/www&quot;, &quot;pass-arguments-to-command&quot;: [ { &quot;source&quot;: &quot;payload&quot;, &quot;name&quot;: &quot;repository.name&quot; }, { &quot;source&quot;: &quot;payload&quot;, &quot;name&quot;: &quot;clone_url&quot;, } ], &quot;trigger-rule&quot;: { &quot;and&quot;: [ { &quot;match&quot;: { &quot;type&quot;: &quot;payload-hmac-sha256&quot;, &quot;secret&quot;: &quot;(omitted)&quot;, &quot;parameter&quot;: { &quot;source&quot;: &quot;header&quot;, &quot;name&quot;: &quot;X-Forgejo-Signature&quot; } } } ] } } ] </code></pre> <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><code>/etc/webhook.conf.d/remove-pages.conf</code></p> <pre><code class="language-json">[ { &quot;id&quot;: &quot;remove-pages&quot;, &quot;execute-command&quot;: &quot;/home/joshua/webhooks/remove-pages.sh&quot;, &quot;command-working-directory&quot;: &quot;/var/www&quot;, &quot;pass-arguments-to-command&quot;: [ { &quot;source&quot;: &quot;payload&quot;, &quot;name&quot;: &quot;repository.name&quot; }, ], &quot;trigger-rule&quot;: { &quot;and&quot;: [ { &quot;match&quot;: { &quot;type&quot;: &quot;payload-hmac-sha256&quot;, &quot;secret&quot;: &quot;(omitted)&quot;, &quot;parameter&quot;: { &quot;source&quot;: &quot;header&quot;, &quot;name&quot;: &quot;X-Forgejo-Signature&quot; } } } ] } } ] </code></pre> <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><code>/etc/webhook.conf.d/update-pages.conf</code></p> <pre><code class="language-json">[ { &quot;id&quot;: &quot;update-pages&quot;, &quot;execute-command&quot;: &quot;/home/joshua/webhooks/update-pages.sh&quot;, &quot;command-working-directory&quot;: &quot;/var/www&quot;, &quot;pass-arguments-to-command&quot;: [ { &quot;source&quot;: &quot;payload&quot;, &quot;name&quot;: &quot;repository.name&quot; }, ], &quot;trigger-rule&quot;: { &quot;and&quot;: [ { &quot;match&quot;: { &quot;type&quot;: &quot;payload-hmac-sha256&quot;, &quot;secret&quot;: &quot;(omitted)&quot;, &quot;parameter&quot;: { &quot;source&quot;: &quot;header&quot;, &quot;name&quot;: &quot;X-Forgejo-Signature&quot; } } }, { &quot;match&quot;: { &quot;type&quot;: &quot;value&quot;, &quot;value&quot;: &quot;refs/heads/gh-pages&quot;, &quot;parameter&quot;: { &quot;source&quot;: &quot;payload&quot;, &quot;name&quot;: &quot;ref&quot; } } } ] } } ] </code></pre> <p>In my home directory I defined all three hook scripts:</p> <p><code>webhooks/create-pages.sh</code></p> <pre><code class="language-bash">#!/bin/bash # parameter 1 is repo name, parameter 2 is clone URL [[ &quot;$1&quot; == *&quot;/&quot;* ]] &amp;&amp; exit 1; # no slashes in the name [[ &quot;$1&quot; == *&quot;..&quot;* ]] &amp;&amp; exit 1; # no .. in the name [[ &quot;$1&quot; == *&quot;*&quot;* ]] &amp;&amp; exit 1; # no wildcards in the name [ -d &quot;/var/www/$1&quot; ] &amp;&amp; exit 1; # the directory must not exist cd &quot;/var/www&quot;; git clone -b gh-pages --single-branch &quot;$2&quot; &quot;$1&quot; || exit 1; </code></pre> <p><code>webhooks/remove-pages.sh</code></p> <pre><code class="language-bash">#!/bin/bash # parameter 1 is repo name [[ &quot;$1&quot; == *&quot;/&quot;* ]] &amp;&amp; exit 1; # no slashes in the name [[ &quot;$1&quot; == *&quot;..&quot;* ]] &amp;&amp; exit 1; # no .. in the name [[ &quot;$1&quot; == *&quot;*&quot;* ]] &amp;&amp; exit 1; # no wildcards in the name [ -d &quot;/var/www/$1&quot; ] &amp;&amp; exit 1; # the directory must exist cd &quot;/var/www&quot;; rm -rf &quot;/var/www/$1&quot;; </code></pre> <p><code>webhooks/update-pages.sh</code></p> <pre><code class="language-bash">#!/bin/bash # parameter 1 is repo name [[ &quot;$1&quot; == *&quot;/&quot;* ]] &amp;&amp; exit 1; # no slashes in the name [[ &quot;$1&quot; == *&quot;..&quot;* ]] &amp;&amp; exit 1; # no .. in the name [[ &quot;$1&quot; == *&quot;*&quot;* ]] &amp;&amp; exit 1; # no wildcards in the name [ -d &quot;/var/www/$1&quot; ] || exit 1; # the directory must exist cd &quot;/var/www/$1&quot;; git fetch origin gh-pages; git reset --hard origin/gh-pages; exit; </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="create-pages-1" tabindex="-1"> <a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#create-pages-1" aria-hidden="true" ></a> Create pages </h4> <p> Target URL: https:// <em>your domain here</em> /hooks/create-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 &gt; Create<br /> Branch filter: <code>gh-pages</code> </p> <h4 id="remove-pages-1" tabindex="-1"> <a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#remove-pages-1" 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 &gt; Repository &gt; Delete<br /> Branch filter: <code>gh-pages</code> </p> <h4 id="update-pages-1" tabindex="-1"> <a class="header-anchor" href="https://joshua.seigler.net/posts/my-very-own-github-pages/#update-pages-1" 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> <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 /> This repo is in my Forgejo instance: <a href="https://git.apps.seigler.net/joshua/marklink.pages.seigler.net" target="_blank" rel="noopener" >https://git.apps.seigler.net/joshua/marklink.pages.seigler.net</a ><br /> And its contents are visible here on my Caddy server: <a href="https://marklink.pages.seigler.net/" target="_blank" rel="noopener" >https://marklink.pages.seigler.net/</a > </p> <p> There is room to make the scripts a little smarter. They don’t handle renaming very well right now, and a few times I had to log in and manually run my webhook scripts, like this: </p> <pre><code class="language-bash">~/webhooks/create-pages.sh marklink.pages.seigler.net &quot;https://git.apps.seigler.net/joshua/marklink.pages.seigler.net.git&quot; </code></pre> <p> The really important thing is that updates just require pushing to <code>gh-pages</code> which you can easily do with e.g. <a href="https://www.npmjs.com/package/gh-pages" target="_blank" rel="noopener" >gh-pages @ npm</a >. </p> <p> I’m also putting off rolling my own CI server, but I imagine that’s the next stage here. Stay tuned. </p> 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> 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> <img src="https://joshua.seigler.net/2025-04-24--computers-will-start-thinking.jpg?v=72b55e6fa16c" alt="Still from TRON, left to right Linda, Alan, and Gibbs, in conversation." /> </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 &amp; 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> <img src="https://joshua.seigler.net/2025-04-24--end-of-line.jpg?v=5d7188be78de" alt="End of line" /> </p> Site design updated 2024-06-05T00:00:00Z https://joshua.seigler.net/posts/site-design-updated/ <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> 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> 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> <h2 id="additional-thoughts" tabindex="-1"> <a class="header-anchor" href="https://joshua.seigler.net/posts/embracing-mysticism/#additional-thoughts" aria-hidden="true" ></a> Additional thoughts </h2> <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> 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> <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 <a href="https://www.cnvc.org/training/resource/needs-inventory" target="_blank" rel="noopener" >a partial list of needs</a > from the Center for Non-Violent Communication (CNVC). </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> <p> <strong>Conflict</strong> happens when our 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> <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> <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 people very differently. This means that feelings must come from a person’s own response to things. In order to see your 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> 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> 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> 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>