This commit is contained in:
Joshua Seigler 2025-06-08 02:15:15 -04:00
parent a4306bc57d
commit 4d435a23c4
15 changed files with 248 additions and 112 deletions

View file

@ -36,10 +36,14 @@ body {
--s4: calc(var(--s3) * var(--ratio));
--s5: calc(var(--s4) * var(--ratio));
--content-width: clamp(75vw, 40rem, 100vw - 3rem);
--sidebar-width: clamp(10rem, calc(0.2 * var(--content-width)), calc(var(--content-width) * 0.5));
--sidebar-width: clamp(
10rem,
calc(0.2 * var(--content-width)),
calc(var(--content-width) * 0.5)
);
--inset: calc(50vw - var(--content-width) / 2);
background-image:
radial-gradient(circle at -20% -20vmin, #0000ff19, transparent 60%),
radial-gradient(circle at -20% 20vmin, #0000ff19, transparent 60%),
radial-gradient(circle at 120% calc(100% - 20vmin), #0873, transparent 60%),
url(/noise.png);
}
@ -48,12 +52,12 @@ body[data-theme="dark"] {
background-color: var(--c-body-background);
}
[data-theme="dark"] {
--c-highlight: hsl(60 20% 30% / 50%);
--c-highlight: hsl(320 40% 20% / 50%);
--c-dark: hsl(217 9% 8%);
--c-accent: hsl(220 20% 35%);
--c-accent: hsl(320 40% 25% / 80%);
--c-body-background: hsl(220 50% 5%);
--c-text-background-light: hsl(220 20% 35% / 30%);
--c-text-background-light: hsl(320 40% 20% / 30%);
--c-text-light: hsl(60 50% 86.67%);
--c-text-dark: hsl(60 50% 86.67%);
}
@ -63,12 +67,12 @@ body[data-theme="dark"] {
background-color: var(--c-body-background);
}
[data-theme="auto"] {
--c-highlight: hsl(60 20% 30% / 50%);
--c-highlight: hsl(320 40% 25% / 50%);
--c-dark: hsl(217 9% 8%);
--c-accent: hsl(220 20% 35%);
--c-accent: hsl(320 40% 25%);
--c-body-background: hsl(220 50% 5%);
--c-text-background-light: hsl(220 20% 35% / 30%);
--c-text-background-light: hsl(320 40% 20% / 30%);
--c-text-light: hsl(60 50% 86.67%);
--c-text-dark: hsl(60 50% 86.67%);
}
@ -116,18 +120,16 @@ a[href]:focus-visible,
nav label:hover,
nav label:focus-visible,
nav label:has(input:focus-visible),
nav label:has(input:checked)
{
nav label:has(input:checked) {
outline: none;
background-color: var(--c-accent);
box-shadow: 0 0 0.5rem var(--c-accent);
box-shadow: 0 0 0.5rem var(--c-accent), 0 0 1rem var(--c-accent);
text-decoration: none;
border-radius: 0.5rem;
}
a[href]:focus-visible,
nav label:focus-visible,
nav label:has(input:focus-visible)
{
nav label:has(input:focus-visible) {
z-index: 1;
outline: 2px solid var(--c-text-dark);
}
@ -191,6 +193,7 @@ aside {
span.aside {
float: right;
clear: right;
position: relative;
width: var(--sidebar-width);
padding: 0.5rem 0 0.5rem 1rem;
font-size: var(--s-1);
@ -202,6 +205,22 @@ span.aside {
span.aside {
padding: 0 0 0 1rem;
margin-right: calc(-1 * var(--sidebar-width));
&::after {
content: "";
pointer-events: none;
position: absolute;
top: -0.5rem;
left: 0.5rem;
right: 0;
bottom: -0.5rem;
z-index: -1;
opacity: 0.4;
background: radial-gradient(
ellipse farthest-side at 50% 0%,
var(--c-highlight),
transparent
);
}
}
}
@ -224,15 +243,16 @@ blockquote {
position: relative;
margin: 1lh 0;
padding: 0 1em;
border-left: 1px solid var(--c-accent);
&::after {
content: "";
pointer-events: none;
position: absolute;
z-index: -1;
top: -0.5lh;
bottom: -0.5lh;
left: -0.1em;
width: 10rem;
max-width: 100%;
background: radial-gradient(
ellipse farthest-side at 0% 50%,
var(--c-highlight),
@ -253,12 +273,6 @@ body > header {
border-radius: 0.5rem 0.5rem 0 0;
}
body > header > nav {
display: flex;
flex-direction: row;
align-items: baseline;
flex-wrap: wrap;
justify-content: end;
gap: 1rem;
margin: 0.5rem 0 3rem;
}
.nav-categories {
@ -272,7 +286,19 @@ body > header > nav {
display: inline-block;
}
}
.nav-row {
width: 100%;
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 0.5rem;
margin-bottom: 0.25rem;
}
.nav-home, .nav-active {
font-weight: bold;
}
.nav-settings {
margin-left: auto;
display: flex;
gap: 0.5em;
flex-direction: row;
@ -347,6 +373,7 @@ footer section {
border-radius: 0 !important;
background-color: var(--c-text-background-light);
> input[type="radio"] {
z-index: -2;
position: absolute;
inset: 0;
opacity: 0;
@ -384,24 +411,25 @@ h4 {
&:hover .header-anchor {
opacity: 1;
}
&::after {
opacity: 0.5;
content: "";
position: absolute;
z-index: -1;
bottom: 0;
left: -4rem;
height: 4em;
width: 30rem;
max-width: 100%;
/* outline: 1px solid red; */
background: radial-gradient(
ellipse farthest-side at 50% 100%,
var(--c-highlight),
transparent
);
}
}
:is(h1, h2, h3)::after {
pointer-events: none;
opacity: 0.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;
}
@ -455,6 +483,9 @@ a.header-anchor {
&::before {
content: "#";
}
&:focus-visible {
opacity: 1;
}
}
.item-summary {

View file

@ -2,8 +2,8 @@ import fs from "fs";
import path from "path";
import md from "markdown-it";
import mdAnchor from "markdown-it-anchor";
import mdFootnote from "markdown-it-footnote";
import { spoiler as mdSpoiler } from "@mdit/plugin-spoiler";
import { footnote as mdFootnote } from "@mdit/plugin-footnote";
import mdLinkAttributes from "markdown-it-link-attributes";
import prettier from "prettier";
import dayjs from "dayjs";

23
package-lock.json generated
View file

@ -11,11 +11,11 @@
"dependencies": {
"@11ty/eleventy": "^3.1.0",
"@11ty/eleventy-plugin-rss": "^2.0.4",
"@mdit/plugin-footnote": "^0.22.0",
"@mdit/plugin-spoiler": "^0.21.0",
"dayjs": "^1.11.11",
"eleventy-plugin-clean": "^2.0.1",
"markdown-it-anchor": "^9.0.1",
"markdown-it-footnote": "^4.0.0",
"markdown-it-link-attributes": "^4.0.1",
"prettier": "^3.3.1"
}
@ -407,6 +407,21 @@
"win32"
]
},
"node_modules/@mdit/plugin-footnote": {
"version": "0.22.0",
"resolved": "https://registry.npmjs.org/@mdit/plugin-footnote/-/plugin-footnote-0.22.0.tgz",
"integrity": "sha512-Zk6jDM+TVtmZJwAS9xG2RCkC3/QIOHZZUKcIElI8k8HaQWOHhjYU/QmHXqf+F5+d5XzLhLr5fAEm4VXDmgQOUQ==",
"license": "MIT",
"dependencies": {
"@types/markdown-it": "^14.1.2"
},
"engines": {
"node": ">= 18"
},
"peerDependencies": {
"markdown-it": "^14.1.0"
}
},
"node_modules/@mdit/plugin-spoiler": {
"version": "0.21.0",
"resolved": "https://registry.npmjs.org/@mdit/plugin-spoiler/-/plugin-spoiler-0.21.0.tgz",
@ -1576,12 +1591,6 @@
"markdown-it": "*"
}
},
"node_modules/markdown-it-footnote": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-4.0.0.tgz",
"integrity": "sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==",
"license": "MIT"
},
"node_modules/markdown-it-link-attributes": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/markdown-it-link-attributes/-/markdown-it-link-attributes-4.0.1.tgz",

View file

@ -14,11 +14,11 @@
"dependencies": {
"@11ty/eleventy": "^3.1.0",
"@11ty/eleventy-plugin-rss": "^2.0.4",
"@mdit/plugin-footnote": "^0.22.0",
"@mdit/plugin-spoiler": "^0.21.0",
"dayjs": "^1.11.11",
"eleventy-plugin-clean": "^2.0.1",
"markdown-it-anchor": "^9.0.1",
"markdown-it-footnote": "^4.0.0",
"markdown-it-link-attributes": "^4.0.1",
"prettier": "^3.3.1"
}

View file

@ -1,51 +1,55 @@
<header>
<nav>
<div class="nav-categories">
<a href="{{ "/" | url }}">{{ site.title }}</a>
<a href="{{ "/posts" | url }}">/posts</a>
<a href="{{ "/timeline" | url }}">/timeline</a>
<a href="{{ "/recipes" | url }}">/recipes</a>
<a href="{{ "/music" | url }}">/music</a>
<a href="{{ "/books" | url }}">/books</a>
</div>
<div class="nav-settings">
<div class="nav-toggles">
<label class="nav-toggle-button" title="Light mode">☀️<input type="radio" name="theme" value="light"/></label>
<label class="nav-toggle-button" title="Automatic">🔄<input type="radio" name="theme" value="auto"/></label>
<label class="nav-toggle-button" title="Dark mode">🌒<input type="radio" name="theme" value="dark"/></label>
</div>
<div class="nav-toggles">
<label class="nav-toggle-button" data-language="english">English<input type="radio" name="language" value="english"/></label>
<label class="nav-toggle-button" data-language="aurebesh">Aurebesh<input type="radio" name="language" value="aurebesh"/></label>
<script type="text/javascript">
const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
const defaultPrefs = {
language: 'english',
theme: 'auto'
};
Object.entries(defaultPrefs).forEach(([key, defaultPref]) => {
const currentPref = localStorage.getItem(key) ?? defaultPref;
applyPreference(key, currentPref, false)
document.querySelectorAll(`input[name=${key}]`).forEach(input => {
input.addEventListener('change', (e) => {
applyPreference(key, e.currentTarget.value, true);
<div class="nav-row">
<a class="nav-home" href="{{ "/" | url }}">{{ site.title }}</a>
<div class="nav-settings">
<div class="nav-toggles">
<label class="nav-toggle-button" title="Light mode">☀️<input type="radio" name="theme" value="light"/></label>
<label class="nav-toggle-button" title="Automatic">🔄<input type="radio" name="theme" value="auto"/></label>
<label class="nav-toggle-button" title="Dark mode">🌒<input type="radio" name="theme" value="dark"/></label>
</div>
<div class="nav-toggles">
<label class="nav-toggle-button" data-language="english">English<input type="radio" name="language" value="english"/></label>
<label class="nav-toggle-button" data-language="aurebesh">Aurebesh<input type="radio" name="language" value="aurebesh"/></label>
<script type="text/javascript">
const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
const defaultPrefs = {
language: 'english',
theme: 'auto'
};
Object.entries(defaultPrefs).forEach(([key, defaultPref]) => {
const currentPref = localStorage.getItem(key) ?? defaultPref;
applyPreference(key, currentPref, false)
document.querySelectorAll(`input[name=${key}]`).forEach(input => {
input.addEventListener('change', (e) => {
applyPreference(key, e.currentTarget.value, true);
})
})
})
});
function applyPreference(key, value, shouldSave) {
document.body.setAttribute(`data-${key}`, value);
document.querySelectorAll(`input[name=${key}]`).forEach(input => {
if (input.value === value) {
input.checked = true;
});
function applyPreference(key, value, shouldSave) {
document.body.setAttribute(`data-${key}`, value);
document.querySelectorAll(`input[name=${key}]`).forEach(input => {
if (input.value === value) {
input.checked = true;
}
})
if (shouldSave) {
localStorage.setItem(key, value);
}
})
if (shouldSave) {
localStorage.setItem(key, value);
}
}
</script>
</script>
</div>
</div>
</div>
<div class="nav-categories">
<a class="{{ 'nav-active' if '/posts' in page.url }}" href="{{ "/posts/" | url }}">/posts</a>
<a class="{{ 'nav-active' if '/about' in page.url }}" href="{{ "/about/" | url }}">/about</a>
<a class="{{ 'nav-active' if '/now' in page.url }}" href="{{ "/now/" | url }}">/now</a>
<a class="{{ 'nav-active' if '/uses' in page.url }}" href="{{ "/uses/" | url }}">/uses</a>
<a class="{{ 'nav-active' if '/recipes' in page.url }}" href="{{ "/recipes/" | url }}">/recipes</a>
<a class="{{ 'nav-active' if '/music' in page.url }}" href="{{ "/music/" | url }}">/music</a>
<a class="{{ 'nav-active' if '/books' in page.url }}" href="{{ "/books/" | url }}">/books</a>
</div>
</nav>
<h1>{{ tag | capitalize if tag else title }}</h1>
<div class="header-meta">

View file

@ -1,11 +1,13 @@
---
layout: base.njk
tags: timeline
permalink: timeline/index.html
title: Timeline
permalink: about/index.html
title: About
---
{{ content | safe }}
{% for item in collections.timeline | reverse %}
{% if item.data.title !== "Timeline" and not item.data.draft %}
{% if item.data.title !== "About" and not item.data.draft %}
<h3 id="{{item.data.time}}"><a class="header-anchor" href="#{{item.data.time}}" aria-hidden="true"></a>{{ item.data.title | markdown | safe }} <aside>{{item.data.time}}</aside></h3>
<p>{{ item.data.description | markdown | safe }}</p>
{% endif %}

View file

@ -7,13 +7,20 @@ layout: "base.njk"
<h2>{{name | capitalize }}</h2>
<ul class="collection">
{%- for item in collection | reverse -%}
<li>
<a href="{{item.url}}">{{item.data.title}}</a>
{%- if item.data.date -%}
<aside>{{item.data.date | formatDate("MMMM DD, YYYY") }}</aside>
{%- endif -%}
<p>{{item.data.description | safe}}</p>
</li>
{%- if (loop.index <= 5) -%}
<li>
<a href="{{item.url}}">{{item.data.title}}</a>
{%- if item.data.date -%}
<aside>{{item.data.date | formatDate("MMMM DD, YYYY") }}</aside>
{%- endif -%}
<p>{{item.data.description | safe}}</p>
</li>
{%- endif -%}
{%- if (loop.index == 6) -%}
<li>
<a href="/{{name}}/">More {{name}}&hellip;</a>
</li>
{%- endif -%}
{%- endfor -%}
</ul>
{%- endif -%}

20
site/pages/about.md Normal file
View file

@ -0,0 +1,20 @@
---
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 balanceing clean perfection against shipping quickly.
I don't know what tomorrow holds, but I'm sure it's going to be great.
## Timeline

View file

@ -4,9 +4,6 @@ title: Hello!
permalink: /
---
I'm Joshua Seigler, a homeschooled kid born in the 80s. I've watched technology advance from dial-up and Geocities pages, to federated social media and decentralized autonomous organizations.
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. My professional focus is on front-end development for web and mobile. See [/about](/about) for more detail.
<!-- At the moment I work for a risk analysis startup called QI Path. -->
I have been a software engineer since 2010, and my focus has been on front-end development for web and mobile. See [my professional timeline](/timeline) for more information.
If you would like to connect, you can [send me electronic mail](mailto:joshua@seigler.net?subject=found+your+website) or [book an "unoffice hours" chat](/unoffice-hours)<sup>[?](https://interconnected.org/home/2020/09/24/unoffice_hours)</sup>
If you'd like to connect, [send me electronic mail](mailto:joshua@seigler.net?subject=found+your+website) or [schedule a video chat](/unoffice-hours).

18
site/pages/now.md Normal file
View file

@ -0,0 +1,18 @@
---
title: Now
layout: "base.njk"
date: 2025-06-07
---
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 enjoy spicy food, board games, and peace.
## 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.

View file

@ -1,3 +0,0 @@
---
permalink: false
---

49
site/pages/uses.md Normal file
View file

@ -0,0 +1,49 @@
---
title: What I Use
layout: "base.njk"
---
## Hardware
- Lenovo LOQ laptop (personal), Framework laptop (work).
- Google Pixel 8 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).
- [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/) Android OS with a privacy focus.
- [SyncThing](https://syncthing.net/) P2P alternative to Dropbox, supports mobile and desktop. Synchronize folders of content across all my devices.
- [VSCodium](https://vscodium.com/) VSCode with less Microsoft.
- [Obsidian](https://obsidian.md/) Notes and reference.
- [KeePassXC](https://keepassxc.org/) Secret management.
## Services
- [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.

View file

@ -31,16 +31,16 @@ Simply put, an LLM is a document completion engine. You give it text, and it ext
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 by Harry Frankfurt | Internet Archive](https://archive.org/details/on-bullshit-by-harry-frankfurt)!! Untrustworthy.
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](https://archive.org/details/on-bullshit-by-harry-frankfurt), _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. Not being human, it *can't* have empathy -- and intelligence without empathy can be dangerous !![AI chatbot pushed teen to kill himself, lawsuit alleges | AP News](https://apnews.com/article/chatbot-ai-lawsuit-suicide-teen-artificial-intelligence-9d48adc572100822fdbc3c90d1456bd0)
[Belgian man dies by suicide following exchanges with chatbot | Brussels Times](https://www.brusselstimes.com/430098/belgian-man-commits-suicide-following-exchanges-with-chatgpt)
[AI-Fueled Spiritual Delusions Are Destroying Human Relationships | Rolling Stone](https://www.rollingstone.com/culture/culture-features/ai-spiritual-delusions-destroying-human-relationships-1235330175/)!!.
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. !![AI chatbot pushed teen to kill himself, lawsuit alleges](https://apnews.com/article/chatbot-ai-lawsuit-suicide-teen-artificial-intelligence-9d48adc572100822fdbc3c90d1456bd0), _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 !![AI, Copyright, and the Law: The Ongoing Battle Over Intellectual Property Rights | IP & Technology Law Society](https://sites.usc.edu/iptls/2025/02/04/ai-copyright-and-the-law-the-ongoing-battle-over-intellectual-property-rights/)
[Generative AI Has an Intellectual Property Problem | Harvard Business Review](https://hbr.org/2023/04/generative-ai-has-an-intellectual-property-problem)!!.
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 ](https://sites.usc.edu/iptls/2025/02/04/ai-copyright-and-the-law-the-ongoing-battle-over-intellectual-property-rights/), _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.

View file

@ -6,6 +6,8 @@ description: Some dev tools I recommend.
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`.

View file

@ -2,6 +2,6 @@
title: Senior Frontend Developer @ [QI Path](https://www.qipath.com/)
time: 2025-present
description: |
QI Path is a startup, 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!
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!
draft: true
---