Compare commits

...

13 Commits

Author SHA1 Message Date
n8r 4dff1b11e5 Add quality ai post 2026-06-03 00:10:16 -06:00
n8r 7b78695b9e new post 2026-05-31 23:00:10 -06:00
n8r 4e72aab2fc Add ceremony post 2026-05-05 01:23:08 -06:00
n8r 72e256fcd3 add two posts 2026-03-20 03:02:02 -06:00
n8r 1fdab41a8d add post and rename post 2026-03-12 23:43:28 -06:00
n8r 514c95a82d add post 2026-03-12 00:32:27 -06:00
n8r 151084a84e add post 2026-03-12 00:31:29 -06:00
n8r 7fb3f19ee0 add communication post 2026-03-10 22:48:12 -06:00
Nate Anderson 85db1d0342 fix aside tag 2026-03-09 17:41:55 -06:00
Nate Anderson ced9cd11f3 Add discrimination post 2026-03-09 17:40:40 -06:00
n8r f02bd683da add post and extra legal, revamp home page 2026-03-09 00:32:57 -06:00
n8r d3efb33db8 add truck post 2026-03-08 00:08:39 -07:00
n8r 809bb3c081 add latest posts 2026-03-06 22:43:27 -07:00
90 changed files with 1068 additions and 82 deletions
+10
View File
@@ -7,7 +7,9 @@ anon's
Anthropic
ASMR
aspell
backend
bluetooth
Bly
btw
CalyxOS
catppuccin
@@ -28,6 +30,7 @@ dev
devs
direnv
distro
DMV
drupals
dysplasia
Fairphone
@@ -44,6 +47,7 @@ Hayao
heatmaps
hehe
hugo
idk
ish
Javascript
jpg
@@ -54,12 +58,15 @@ Kimber
kombucha
lastmod
LDS
libre
linux
LLM's
lobste
localhost
lol
LSP
MacOS
Mahjong
Makefile
markdownlint
md
@@ -87,6 +94,7 @@ philips
PinePhone
pixelated
PostMarketOS
POV
pre
Pre
Reddit
@@ -110,6 +118,7 @@ syscalls
TCL
Termux
tik
tiktok
tils
TILs
tok
@@ -132,4 +141,5 @@ yapper
Yay
zig
Zig
Zillow
zoomers
+29
View File
@@ -0,0 +1,29 @@
# fosscat.com image optimization manifest — do not edit manually
2aeea48d6df9070f9c500ffa0af9dd58ff3fbb4a8200098a6a224d4bdc1be692 static/images/arch-logo.webp
49588883b06b4ec5a8e0bc09ca608816c83a0b0d4df158893d00e51fd93d60be static/images/eagle-wizard.webp
1db221e53cdab01ddf9847f9c2b56e39e95d8792eaeac775af7426704758ac6f static/images/elephant-and-blind-men.webp
a0628903bb9cb0ede12850d31692258db086d5a4ac0850ab91bea92235041345 static/images/ford-f150.webp
fa1a695caee36958d0ef33187b2c051ac3d7e3daf1bf3f87fe0410f87ccd4d94 static/images/fosscat_icon.webp
b8e279fc1296c255785b8c6938abc167576e68ad16f76c9e482ec07e36f76ac6 static/images/framework-banner.webp
3026c3136af7cff1f63f8148af6ad5fc082f41e4622c9cdbe03748ceaabf7fdc static/images/hammock.webp
6b778f29cfb98a79bc195ad9313ff90c06b06c3b2c658ab094a8cdb2a46a4e2c static/images/japan-arrival.webp
790b7e2f9a2b34333ada91ca37feb1ad219e51ecfd9103d30e50ae402beb19c1 static/images/japan-fuji-town.webp
25299e08100976e4b64e0b1e1e62aa68fd65515e24206f241ed16e63e4f40306 static/images/japan-fuji.webp
277eb4cea7f007987f437664ded582edd355e650aa3c083b526006a0dee82805 static/images/japan-mcdonalds.webp
918ecc79f2ac4a926ee39fe58ab286acbf94a715fab0695eaf2b66cfbee1abc4 static/images/japan-nekomachi.webp
a5b3a9a08fbccc48e41af6e77cbd9d5d50ff82482bf70e28fadcbcedf4446ee7 static/images/japan-nippori-graveyard.webp
a7f2129eea90da48a53be5115139786b4bb70429b089478f75a21d3a49f9d7c2 static/images/japan-nippori-walk.webp
83c301aca3822e953e6c0193a0ac0beb7fc9b3e1dfc48eef2f8fc5bc06b45440 static/images/japan-noodle-cup.webp
84754eefc88b71ec92abc008f9dddd21b8891e8a1864335ff94d1cc4a03af161 static/images/japan-shinjuku.webp
396851979b183b195ecdfd30e01d67dab6de3891eaaba043607f6eec5954b43e static/images/japan-shinjuzu-garden.webp
66b3456d8d6f670efb1609143dd987ee2540fae4d161ec57882ae0524dc6df33 static/images/japan-spirit-tree.webp
0b1179ecbc906abc418baa0ae2cb24b7f23128f4c3e748fba3a02d6e3ef55c2a static/images/monochrome-path.webp
13196fdb9ae802e1998e1ceeeaff6e774d9962b8a918107d016f63a60b99416f static/images/nginx-mumble.webp
bf721881652c94518b2b46dab9c13c9ca05c2211dade76f8cc68ce0c1fb7e481 static/images/ocean-aerial.webp
c59b6bfe6695c3d82b13375098d4c4f8ac62859e53e7a028d2dee3680f18d6c9 static/images/otto-1.webp
5814fb056057f022d67e144ad9c66fb2c7bfd2bfb7460eb50f8c33597cde33af static/images/otto-on-nature-path-algorithm.webp
29604251ddc2c916e470d77d37a88539888adb3dba45b8ce7c238fdd1aa88e95 static/images/rpi-bookshelf.webp
160b041274ea70f90484af2bc376f969888d2418dabc51eef55ce05ea306c9b9 static/images/salt-lake-basin-view.webp
d2db5eb5fb460359a9017eba824d9e07d80adf206b30953c0d5fbcea4e421e89 static/images/red-path.webp
9e9ccdd43cf44fa8f830dd34043a8ddb6b596565c8b56ccc59d596184b1f18b9 static/images/moonlit_landscape_with_bridge_1990.6.1.webp
eebed31e76a47681a3aae7809034ecd7366f3680068224488a58f24e8974ae85 static/images/woman_holding_a_balance_1942.9.97.webp
+2 -1
View File
@@ -2,7 +2,7 @@ baseURL= "https://fosscat.com/"
defaultContentLanguage = "en-us"
title = "Foss Cat"
theme = "gokarna"
enableRobotsTXT= true
enableRobotsTXT = false
enableEmoji = true
# pygmentsStyle = "catppuccin-frappe"
@@ -16,6 +16,7 @@ socialIcons = [
]
# <link> tags for favicon support
customHeadHTML = '''
<meta name="robots" content="noai, noimageai">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
@@ -1,8 +1,8 @@
---
date: 2025-01-28
description: "I realized that I've been holding myself back because of pride."
lastmod: 2025-01-28
showTableOfContents: true
lastmod: 2026-06-03T00:08:31-06:00
showTableOfContents: false
tags: ["ai", "reflection"]
title: "AI Hesitation Turning Around"
type: "post"
@@ -15,7 +15,7 @@ tags: ["life", "dogs", "history", "til"]
I started listening to [_Sapiens: A Brief History of Human
kind_](https://en.wikipedia.org/wiki/Sapiens:_A_Brief_History_of_Humankind) and was struck at the significance of dogs
in human history. I [realized](/posts/people-are-actually-right) that dogs really are man's best
in human history. I [realized](/posts/25-09-30-people-are-actually-right) that dogs really are man's best
friend, and only animal that has evolved alongside us since the hunter gatherer period. Its incredible!
# Reflection
@@ -12,7 +12,7 @@ tags: ["history", "til"]
# Context
[As I mentioned](/posts/we-created-dogs-and-dogs-created-us), I'm really enjoying the
[As I mentioned](/posts/25-10-03-we-created-dogs-and-dogs-created-us), I'm really enjoying the
[Sapiens](https://en.wikipedia.org/wiki/Sapiens:_A_Brief_History_of_Humankind) book. I was shocked to discover that
hunter gatherer societies were comprised of extremely intelligent humans!
@@ -57,7 +57,7 @@ the hands of most, its a tool for goofs. But in the hands of a few, its a tool f
## Escape Velocity
[Previously](/posts/ai-hestiation-turning-around), I stated I'd give AI a fair shake. I committed to using AI
[Previously](/posts/25-01-28-ai-hestiation-turning-around), I stated I'd give AI a fair shake. I committed to using AI
for a year. I'm contemplating cutting that short. I think AI has made me dumber. I'm certainly more dependant on a $20
subscription to do my job and less sure of myself. Perhaps we can have a healthy intermittent fasting culture with AI.
I'm not sure.
@@ -2,7 +2,7 @@
date: 2026-02-25T23:08:49-07:00
description: "Looks like I will be returning to my little flip phone"
draft: false
lastmod: 2026-02-26T00:45:22-07:00
lastmod: 2026-03-06T22:41:50-07:00
showTableOfContents: false
tags: ["phone", "technology", "lifestyle"]
type: "post"
@@ -17,7 +17,7 @@ Apparently, putting your phone in rice doesn't really fix things.
Shaking excess water off and putting the phone in a well ventilated area is what is actually recommended.
[Yesterday, my Pixel Fold fell](../posts/what-do-you-want-in-a-phone) into a dog bowl, and I'm using it as an excuse to go back to my TCL Flip 2. The Pixel Fold is a great phone, but I think my life will be more full without it.
[Yesterday, my Pixel Fold fell](/posts/26-02-24-what-do-you-want-in-a-phone) into a dog bowl, and I'm using it as an excuse to go back to my TCL Flip 2. The Pixel Fold is a great phone, but I think my life will be more full without it.
I booted it up and swapped my SIM card into it. It reminded me how much I enjoyed having this little phone on me for those months last year.
@@ -1,8 +1,9 @@
---
date: 2026-03-05T00:20:24-07:00
date: 2026-03-04T23:20:24-07:00
description: "A hopeless plea to those in power to stop fighting"
image: ""
lastmod: 2026-03-05T01:00:19-07:00
lastmod: 2026-03-06T22:41:50-07:00
draft: false
showTableOfContents: false
tags: ["politics", "war"]
title: "Why Do We Keep Fighting Wars?"
@@ -33,9 +34,9 @@ In your quaint town full of little rascals like yourself, everyone plays the gam
You could pinpoint many reasons why. Born with two left feet, to parents without the means to get you your own chess set, needing to borrow others to practice. So on and so on.
More importantly, loud-mouthed-profesional-yapper Chad excels at the game. Many think he is unbeatable.
More importantly, loud-mouthed-professional-yapper Chad excels at the game. Many think he is unbeatable.
> So what's the rub?
> So what's the rub?
Every time you lose at the game, which you do every time playing against this bro, Chad tells you in no uncertain terms how bad you are.
@@ -0,0 +1,35 @@
---
date: 2026-03-05T21:15:30-07:00
description: "Taking time to pay attention to your body pays off."
# image: ""
lastmod: 2026-03-12T23:41:32-06:00
showTableOfContents: false
tags: ["body", "health"]
title: "Body Awareness Is No Joke"
type: "post"
---
# Releasing Tension
I [carry baby in a carrier](/posts/26-02-28-baby-carriers-are-exceedingly-good) pretty often, and find it leaves my back achy.
I took a moment to really try and feel the texture and shape of this ache. After some online anatomy searching, I pinpointed the vertebrae (T5-T9 area) and that seemed to contain the strain.
With just patience and breathing, I focused on expanding my posterior rib cage. Waiting for my body to loosen the grip of just the surrounding muscles guarding the tension.
{{<aside caption="My Big Insight">}}
I always thought relaxing was a willed state. A quieting of the mind, of thinking to not think.
This of course only reinforces the sympathetic nervous system.
In reality, it's the mind dropping the background.
I learned I can only create the conditions for the parasympathetic system to take control. Similar to dilating your own pupils, you can't will that, it happens based on the lighting conditions around you.
{{</aside>}}
## Sources
For some "light" reading on all of this if you are curious:
- [The Stretch Reflex (Wikipedia)](https://en.wikipedia.org/wiki/Stretch_reflex) causes muscle flexion when stretched to a certain point
- [Golgi tendon organ (Wikipedia)](https://en.wikipedia.org/wiki/Golgi_tendon_organ) signals to muscles relax when the right conditions are met
@@ -0,0 +1,48 @@
---
date: 2026-03-06T22:13:10-07:00
description: "Some thoughts on what makes a good gift, and why its hard to do it well."
# image: ""
lastmod: 2026-03-06T22:41:50-07:00
showTableOfContents: false
tags: ["life", "practices"]
title: "Good Gift Giving Is Difficult for Good Reason"
type: "post"
---
# A Gift is No Simple Thing
I think the standard low-effort but always appreciated gift is money.
Money indicates that you value some person, but don't really have the time to invest in finding something meaningful.
I think every person is different, so having a class of "evergreen" gifts is nonsense.
To give a truly nice gift requires selflessness.
You need to take time to start listening.
I think people signal things they want all the time.
## The First Kind of Gift
Lots of people I know are uncomfortable with the question "What do you want for \<special occasion\>?" It's so direct. Worse, its a trap, answering broadcasts how truly un-humble you are, needing trinkets and worldly things. No no, better to say something bland, normal, or nothing at all.
But unprompted, people will telegraph countless things they wish for. Some are hard to wrap, like a bigger home, or a different career, or more fulfilling relationships.
But notice, each of those things can be delivered, in some form, as a gift of time and attention: time set aside to scroll Zillow together and dream, a tighter budget to allocate funds to education or trade school.
This is the first precious gift you can give someone: __noticing__.
## The Priceless Gift
Time.
We come here with only so much.
Any moment you take to be with someone is precious, final, and non-refundable.
Giving your time to someone typically looks in our heads like being with them. But it's certainly possible to give your time to someone by yourself. Researching just the right piece of jewelry or keyboard based on the criteria you know they look for may be invaluable.
I want to stretch my gift giving abilities. Put myself in another's shoes, think from their POV (as best as I can manage) and give a thing I (they) would truly appreciate.
It's so easy to give the thing we would appreciate; always presented in our minds. A meal, a movie ticket, an obscure tiny Linux computer. Much harder is to give what the person actually wants.
@@ -0,0 +1,40 @@
---
date: 2026-03-07T23:30:48-07:00
description: "From a legal loophole in the 70's, we now deal with tanks on American roads."
image: "/images/ford-f150.webp"
image_alt: "An image of a vintage blue Ford F150"
lastmod: 2026-03-09T00:32:23-06:00
showTableOfContents: false
tags: ["cars", "politics"]
title: "How Cars Became Trucks"
type: "post"
---
# An American Saga
As every great story in the U.S. of A. goes, what started small and mighty is now big and ugly.
The American car manufacturers played a big role in American life and in American government. They represented the heart of this country's manufacturing as well as the force that got everyone where they needed to go.
No other country adopted the car quite so integrally as the United States did.
But, as the [government cracked down on polluting cars](https://en.wikipedia.org/wiki/Clean_Air_Act_(United_States)#Regulatory_programs) coupled with the [1973 oil embargo](https://en.wikipedia.org/wiki/1973_oil_crisis), consumer sentiments toward these gas guzzlers started to shift. Car manufacturers were obligated to reach a target MPG of 27.5 of the average car sold in their fleet by 1985.
{{<aside>}}
I was shocked to learn this was the _average_ MPG of an entire manufacturer's offering. 30 years ago!
{{</aside>}}
This new legislative requirements for efficiency and safety applied to cars. However, a little slice was cut out for light trucks, work trucks, non-passenger work trucks. Seems like there are multiple terms for it...
Which makes some intuitive sense. A farmer's work truck shouldn't be held to the same standard as a commuting vehicle, its very hard to achieve that sort of fuel efficiency while idling half the day outside the barn.
## The Truck-Shaped Loop-Hole
However, the American car manufacturers notice something interesting:
People will pay more for bigger cars, we can make bigger cars for cheaper. If we classify them as work trucks they aren't beholden to the same safety regulations, and sell them for a larger margin!
Long story short, massive trucks flood the streets of you average road in the U.S. It's evolved into a collective action problem due to the danger these huge vehicles pose.
With regular cars, there are tighter regulations on the bumper, namely how high off the ground they sit. But for work trucks? No, we gotta get over some rocks, raise that bumper up!
A [great video on the topic (YouTube)](https://www.YouTube.com/watch?v=JPm4de6-eTg) was recently published by Climate Town on YouTube, I enjoy their stuff so I recommend giving it a watch!
@@ -0,0 +1,55 @@
---
date: 2026-03-08T23:12:51-06:00
description: "As the internet sours past its due date, why blog? And what about?"
# image: ""
lastmod: 2026-03-10T22:47:30-06:00
showTableOfContents: false
tags: ["privacy", "internet", "life"]
title: "What Is Appropriate for the Internet"
type: "post"
draft: false
---
# What should go here?
As I write each day, I find myself self-censoring some topics.
Obviously if I had extreme political views or problematic takes on things, I could suffer real world consequences. Cancel culture is alive and well in the United States, on both sides of the aisle. So, regardless of your political leaning, the internet is not safe.
With AI becoming [more _amazing_ every day (nytimes)](https://www.nytimes.com/2025/11/02/opinion/ai-privacy.html), and [data brokers amassing mounds of data (cnet)](https://www.cnet.com/tech/services-and-software/data-brokers-how-your-personal-data-becomes-business/) on each of us, one might think putting some intimate thoughts online is not the wisest decision.
{{<aside>}}
To the uninitiated, this is really only a concern to the privacy conscious. Or perhaps, the privacy paranoid :grin:.
Social Media aggregates tons of data on its users, which is sold to data brokers and integrated into algorithms. I don't mean to overstate this but everyone I know uses social media. Lots of people I know feel like this whole dilemma is too far gone for anything to be done.
At least on my website, people have to come and take it. Plus, I have just added some [more explicit guards](/terms) against [getting my data harvested](/robots.txt). So, fingers crossed the line gets crossed then I can sue for billions :smiling_imp:
{{</aside>}}
But, I think the with some prudence, putting thoughts online is an excellent use of time.
## Why It Matters
AI is melting my brain.
At my day job as a Software Developer, I cannot code like I used to. Sure, perhaps I've learned how to be an "AI-Whisperer" or something.
But it feels like I've lost an edge.
I think about the times I studied hard for a final exam. All the necessary concepts are fresh. Poised to strike, from neuron to graphite. The formulas are at the tip of my tongue ready to be spat out onto the page to prove my know on how to find the area of a circle rotated around an axis in three dimensions offset by some coordinate. Amazing.
I've lost the edge for the things I ~do~ did every day: write code.
Now? I, manage. Architect? Oversee? Sometimes just skim?
Anyway, this is really material for a different post.
Point is, writing these posts keeps me sharp. Maybe not for coding, but certainly for self reflection.
I find that invaluable.
And if some data broker gets to track me down and endanger my family and I because GPT-10 identified me as a terrorist threat, then so be it. These privacy concerns unfortunately feel like a collective action problem. Though an individual can logically conclude it foolish or dangerous, I think it's important to fight for what we would like to see in the world.
I'd like to see less billboards. Less [trucks](/posts/26-03-07-how-cars-became-trucks/) (which is also a collective action problem). Less AI generated internet content. Hopefully someone lands here from searching on a search engine (did you know Google isn't the only one?). I'd like to be a part of the human-made side. I find writing these to be helpful, and I hope someone out there will find something helpful here too.
[Let me know](mailto:feeback@fosscat.com) what you think! If you agree of disagree with anything on this site, I'd love to hear from you. Take care.
@@ -0,0 +1,62 @@
---
date: 2026-03-09T13:14:02-06:00
description: "If we didn't need to distinguish between you and me, we would just be we."
# image: "/images/"
# image_alt: ""
lastmod: 2026-03-09T17:41:55-06:00
showTableOfContents: false
tags: ["philosophy", "buddhism"]
title: "Discriminating Creates the Other"
type: "post"
draft: false
---
# Why Do We Discriminate?
When I use the term _discriminate_ here, I don't mean specifically prejudice towards another race (the purely social construct). I mean any sort of discriminating. The sort of discerning between me and thee. The identification of yourself against the backdrop of what is before you.
Wishy washy terms aside, lets get real with a fake story:
{{<aside>}}
You meet someone new standing in line at the DMV. Busy day. You don't normally talk to strangers around you (as you were taught, stranger danger!). But this stranger had a t-shirt on of your favorite TV show! You compliment their taste. They agree with your seemingly shared excellent taste in "the classics". So, conversation starts up. First around the show, but then you ask questions about their life, their circumstance. You find you agree more and more with this person. Their politics line up with yours. Their food preferences are eerily similar. They even ask for the sauce to be put on the side instead of the bun like you do! By the time your number gets called by Deb behind counter 7, you have fallen fast. You both exchanged phone numbers (theirs was only 1 digit different from yours), made plans to play Mahjong together (they also just got into it!), and you feel like you just met your soul mate / friend! You soul friend! (that should be a term)
{{</aside>}}
What started as a stranger ended up being your greatest friend! What prevented you from treating this person as a friend from the start?
Discussing your lives did not change what they were already doing. It did not change their quirks and preferences to align with yours. They were already just so!
So what changed?
## You Don't Trust
I think its a survival instinct we come installed with. Perhaps its bloatware, but it was certainly necessary at some point in our evolution.
Through introspection, I believe you can find the uninstall button. But it takes work.
This stranger in line becomes a wonderful companion because you feel safe with them. You agree with each other after all!
But disagreeing doesn't represent anything dangerous. I think we often feel that way. If someone disagrees with my worldview, then is my worldview wrong?
I remember as a Mormon missionary literally feeling my fight or flight response kick in when I was approached by spiritual "enemies". Ex-members, pagans, other Christians (some would say Mormons aren't, if disagreeing with me here helps you feel better, I encourage you to start from the top), etc.
I wasn't in danger physically. But my body responded nonetheless! Because my brain was so sure if I was proven wrong, my world as I knew it would cease to exist!
## Soul Friends
I think we are our own worst enemies, keeping any ordinary person from appearing as a soul friend.
Sure, not everyone is just like us. In fact, most people aren't like us in the specificity.
But, every person is also just like us. Deeply flawed, unique, with our own baggage and experience and fishing stories and fears of childhood recesses because of Blake Thorne.
We all are alive. We all will die. We all get to grapple with the same forces day to day. We all see the sun and feel the rain.
I don't mean to sound stereotypical here. Really, I challenge you to contemplate this:
> In a very real way, we are all the same.
But our brains want us to live. We have to identify threats. Categorize objects. Remember wrongs and being wronged so we don't get burned. Or worse.
We gossip about the neighbor because in some small way, they pose a threat to us. Our routine.
I wonder how different things would be if we could get over discriminating.
@@ -0,0 +1,48 @@
---
date: 2026-03-10T22:10:22-06:00
description: "Communicating is hard. I've realized that we talk to others how we would like to be talked to."
# image: "/images/"
# image_alt: ""
lastmod: 2026-03-10T22:47:30-06:00
showTableOfContents: false
tags: ["psycology", "communication", "relationships"]
title: "We Talk How We Would Like to Be Talked To"
type: "post"
draft: false
---
# The Value of Contraction
Today I learned what the Platinum Rule is, the Golden Rule's cool older brother.
> Treat others how they would like to be treated.
Nothing wrong with the golden per se. But I think once you have tested out, the platinum is perhaps the next step.
We often assume how we want to be treated is how everyone wants to be treated.
Sure, this may be the case generally, but specifically, not everyone likes to be affirmed the way you do. Not everyone likes the gifts you like, or the holding and consoling the way you like.
[The false consensus effect (Wikipedia)](https://en.wikipedia.org/wiki/False_consensus_effect) posits that people often overestimate how common their beliefs and views are held by others.
I think our natural state is here. We assume people think like us. This is the cause of a large portion of contention in relationships.
When we become curious however and turn in, magic happens.
## Some Curious Questions to Try
I think everyone at any given moment is doing their best. (I think you could equally say their worst, because I think we just are being).
If any one of us had the brain and memories of another, we would act just like the other.
So, let's cut the assumptions. We really don't know how any other would like to be treated specifically.
Some questions I think you could try asking someone close to you to help you turn in to them:
> "How best could I communicate to you that I'm listening?"
> "How can I best help you when I want to give you aid?"
> "What are some things I could do spontaneously that you would probably always appreciate?"
If you can create a space big enough and safe enough, you might be surprised what comes out.
@@ -0,0 +1,62 @@
---
date: 2026-03-11T23:00:22-06:00
description: "My reflection on the Netflix show Love is Blind, it strips people of their humanity."
# image: "/images/"
# image_alt: ""
lastmod: 2026-03-12T00:32:27-06:00
showTableOfContents: false
tags: ["media", "rant", "communication", "relationships"]
title: "Love Is Blind Causes Blindness"
type: "post"
draft: false
---
My wife and I used to watch Love is Blind pretty consistently. Years ago. Perhaps seasons 2-4.
Every now and again we dip our toes in. A family member watches and wants to have a tea talk.
Well, the season 10 final episode, the reunion, aired tonight. I came away feeling so empty.
## The Villain is in Each of Us
There was one man (I almost said character, yeesh) who was collectively identified as the season's villain.
He made an emotional connection, got engaged, and on leaving the pods, seemingly turned on his fiance. Apparently, he was not physically attracted to her. Had weird conversations and speaking poorly of her behind her back. Made advances on another girl who was currently engaged to another guy in the show. There were lots of other details that highlighted his flawed state.
Well, the final episode airs. They give about a year's time after the actual season was recorded. The people from that season come back together to hash out details, get some last words in, and catch all of us up on our para-social relationships' statuses. It's all very strange, but totally normal and mainstream seemingly.
Anyway, so many people wanted to call this guy out for his actions.
My wife commented "I wonder how much they have to pay him to show up to this beat down."
I'd be curious to know behind the scenes what motivated him to show up. Honestly, it might have been to apologize, because that's basically all he did.
I respected him for that. And I quickly pitied him.
I think there is something really compelling to a villain that is humanized. Good villains deserve their punishment. Great villains are understandable and reprehensible at the same time.
I was so disappointed for the people in the room, those that claim so much to focus on emotional connections and emotional intelligence, cannot see that he needs emotional support.
It seemed to me that he struggled with some insecurities. I thought that he showed he could not communicate clearly his feelings.
And to this the mob of emotional intellects want to watch him squirm. I felt compassion for this guy. Sure, he crushed this girl's heart. I'm by no means saying getting his apology was bad. But I think the collective has caused immense damage to a man that may not ever heal, just so we, the completely removed from the situation viewers, can have some sense of justice?
I was equal parts filled with compassion and disgust. I almost can't believe this is what now constitutes entertainment.
## Patterns of Blindness
The patterns of communication that bothered me but I may not exactly know why:
- Women frequently saying to their male connection they did not marry "I know there is a good guy in there"
- The male host kept saying "man to man" when trying to catch some of the guys out, like being honest and a man of your word is just a guy thing? I guess all women don't keep their word? Or like, you aren't a "man" if you lie, you are a boy?
- I would absolutely consider myself a feminist (if this seems weird to hear from a guy, I encourage you to look up the definition), but there was a lot of man hate energy. It felt uncomfortable. Not as a man feeling targeted, I think more as giving women a bad look? idk. that might not be quite it...
- I felt like so many of the women that were single were working on themselves, which was met with applause. The guys were kind of laughed at for just being around lol sad
- I think it was clear to see in the majority of cases the women had much more emotional maturity and intelligence than the men. Women could articulate well their perspective, identify problems better, etc. The men often missed getting the memo. This bothers me. I wish men would step up and take responsibility to learn communication skills.
All in all, I think I'm filled up on Love is Blind. It was fun and interesting in the beginning. Watching couples genuinely try to grow in love together gave my marriage relationship something to learn from and contrast with. I think we found it helpful and cathartic. Now, I don't know what this Frankenstein has become.
Also, the end of the show culminated in an ad from Turbo Tax. They gifted a couple a honeymoon trip. Insane product placement. It kind of blew my mind, felt like a Truman Show level ad. I felt like no one saw the Turbo Tax part, they just heard free trip.
In summation:
There was no love, only blindness.
+43
View File
@@ -0,0 +1,43 @@
---
date: 2026-03-12T23:01:14-06:00
description: "At the end of it all, what will it take for us to feel enough?"
image: "/images/red-path.webp"
image_caption: "Red Path, St. Prex - Courtesy of the National Gallery of Art"
image_alt: "This painting is an abstract composition of irregular shapes and vibrant colors. The different sections overlap and intersect in shades of green, blue, red, purple, and pink. A blue section in the top left has black dots, and two purple sections towards the bottom have white dots with yellow centers. In the upper center of the painting, there is a section of crossing black lines in a small grid. The paint has been applied unevenly in thick, scribbled lines, and some patches of the white canvas are visible."
lastmod: 2026-03-12T23:41:32-06:00
showTableOfContents: false
tags: ["life", "reflection"]
title: "What Is Enough?"
type: "post"
draft: false
---
> When I reach the end of it all,
>
> &nbsp;&nbsp; What will help me feel like it was enough?
>
> With the weight of my duties
>
> &nbsp;&nbsp; Puffing my chest out to seem extra tough.
>
> Safety in a full bank account
>
> &nbsp;&nbsp; And a house full of stuff?
>
> Or perhaps a love so real
>
> &nbsp;&nbsp; I'm shown what life is made of.
>
> Can anyone reach it?
>
> What would I feel if I got there?
>
> Does craving cease? Or will I finally understand what is "crave"?
>
> &nbsp;&nbsp; A rouse, an illusion --
>
> &nbsp;&nbsp; A reflection of something more --
>
> &nbsp;&nbsp; A dream waiting to be dispersed with waking --
>
> Would, that I just can be enough.
@@ -0,0 +1,55 @@
---
date: 2026-03-13T23:57:57-06:00
description: "My first attempt to do some art analysis myself on a painting I've never seen before."
image: "/images/woman_holding_a_balance_1942.9.97.webp"
image_caption: "Johannes Vermeer, courtesy of National Gallery of Art"
image_alt: "In this vertical painting, a woman stands near the corner of a dimly lit room, facing our left in profile and looking down at a balance she holds suspended in her right hand over a wooden table. She wears a peacock-blue velvet jacket with a white hood and fur lining, and a voluminous, mustard-yellow skirt. A window near the upper left corner is partially covered by a canary-yellow curtain. Light coming in through that window falls on the pale skin of the woman's face and hands, and highlights the white trim of her garment. Her left hand, closer to us, rests on the edge of the table near two open boxes, and a blue cloth is bunched at the back of the table to our left. Gold chains and pearl strands drape over the edge of one box. The woman stands in front of a framed painting. Much of the detail is lost in shadow but at the top center of the painting, a person surrounded by a golden halo floats in the sky with both arms raised, and is flanked by people encased within a bank of clouds. Nude people on the ground below in the painting, seen to either side of the woman, writhe, twist, and point upward."
lastmod: 2026-03-20T03:02:02-06:00
showTableOfContents: false
tags: ["art", "religion", "ai"]
title: "Art Analysis: Woman Holding a Balance - Vermeer"
type: "post"
draft: false
---
I don't think I've ever really sat with art. Static art.
Motion pictures and temporal audio (music) feel like a different class. The still art requires something more from you.
I wanted to know what that more was, and what better time than the present.
## My Journey to The Balance
Not knowing any good resources I asked AI (Claude) the following:
{{<aside>}}
I feel like I'm not sure how to appreciate art. I have done some writing and doodling, not terrible at either, but when I read poetry, or look at art (paintings, photography) I feel like I'm not sure how to appreciate it. Is there a science to it? or just some helpful mindsets to take toward observing art? I feel like I've moved past the "need" for art to speak to me and instead just be open to whatever a piece of art may invoke. What sorts of things make art art? I imagine its in the eye of the beholder? Is art's worth determined by its creator? Can you appreciate art if the artist is a terrible person? Not exactly sure how to feel toward art, but I haven't ever really had any sort of moving experience with art outside of music and motion picture.
{{</aside>}}
Aside from the philosophical questions (perhaps they all were), some interesting highlights I pulled out:
- Visual art and poetry require you to impose a temporal unfolding yourself (unlike video or music that "play")
- _First Pass_ With no context, look at a piece of art for a few minutes. Notice what your eye is drawn to. Notice how you feel.
- _Context_ Then with some observation, learn more about the art. Its background, the artist's process.
- _Synthesis_ Sit with this new information and the art again. See what arises in you.
With this rough framework here is what I felt and observed about Vermeer's 400 year-old painting:
{{<aside caption="Analysis">}}
### On First Pass
- The balance sits perfectly balanced in the very center of the painting.
- There are many other features of the painting that are balanced, a dark blue shade of fabrics on the middle left and right sides, light yellow of the window and dress in the top-left and bottom right.
- At the same time, lack of balance in the painting: only one woman on a side. The much larger framed painting in the background on the right compared to the one on the wall on the left, the lighter portion of the painting is the top right, darker bottom left (cut diagonally almost, which feels balanced more than imbalanced I suppose)
- The woman's gaze is easy to follow - lands on the balance she is holding
- The woman seems perhaps pregnant?
- The framed painting seems like a Jesus second coming or judgement day type? perhaps the woman being a Mary symbol?
- did the artist put the scale in the middle of the painting at the very beginning? (maybe first the background wall, but then the scale) thought that would be an interesting grounding piece for the artist to work around and place balancing and unbalancing elements around the balance.
- I thought that the painting left me feeling maybe a little dissatisfied, like I wanted compositional completeness but something feels missing? I felt I guess... off? only slightly so.
- The balance itself is kind of hard to see, or maybe easy to miss? wonder if that speaks to the balance in the painting being easy to miss?
Then AI gave some context on those thoughts. The highlight for me being about Judgement Day.
I realized in a moment of reflection the religious trauma I feel I still have.
{{</aside>}}
@@ -0,0 +1,53 @@
---
date: 2026-03-20T02:09:41-06:00
description: "Humans spent thousands of years staring up at the sky. Now I wonder if many of us do at all."
image: "/images/moonlit_landscape_with_bridge_1990.6.1.webp"
image_caption: "Moonlit Landscape with Bridge: Aert van der Neer"
image_alt: "In almost complete darkness, we look across reeds and grasses lining a river spanned by narrow, arched, stone bridge ahead of us in this moonlit, horizontal landscape painting. The horizon comes about a third of the way up the painting, just over the footbridge, and the sky is filled with clouds that glow blush pink, flint gray, and lavender purple. The small, porcelain-white moon casts an opalescent gleam on the water under the arch of the bridge. Barely visible in the gloom, a walking path lined by a fence in the lower right corner leads to a copse of tall trees to our right. Closer inspection reveals a man wearing crimson red and a woman wearing pine green standing together near the gate of a walled enclosure beyond the trees. Moonlight glints on their white collars and cuffs, and on the gold buttons and embroidery on their clothing. Spires and buildings with stepped rooflines along the riverbank are outlined against the illuminated sky, though most of the details of the structures are swallowed in shadow. "
lastmod: 2026-03-20T03:02:02-06:00
showTableOfContents: false
tags: ["technology", "philosophy"]
title: "Have We Lost the Stars?"
type: "post"
draft: false
---
There is a park near my home.
In the middle of this park is a modest hill. If one lays down on the top of the hill, looking to the heavens, your visual field is left stranded in the deep blue.
I have started going out at night with my dog. He gets to run, and I gaze.
In our ever-quickening modern world, I wonder how often we look up at the sky. Aside from this recent curiosity, I really only take the opportunity when camping or deep in nature.
Its a shame really. Its most always there just waiting to be admired.
The sky is full and (mostly) untouched from human expansion. It remains clear and free from cement sidewalk and suburban sprawl. Until we fill the night sky with satellites, it even twinkles with distant planets and galaxies.
## Humans Gazed Through History
I have a hunch, an intuition completely unfounded in any hard science. I think for millennia humans concluded their days staring into crackling fires or expansive night skies.
Now, many of us end our days staring into a neat little grid of LED's, myself included.
What, if anything, have we lost?
I wonder if we wonder less.
I feel instinctual attraction to an open flame. And when camping, I can't resist gazing up in awe.
I would wager these infinities are not being tapped into as often.
Not to sound like a [Luddite (Wikipedia)](https://en.wikipedia.org/wiki/Luddite), but with every new piece of technology, I can't help but think there are always trade-offs. The less obvious the exchange, the more insidious.
We humans can't stand the tedium. We want everything to be seamless. Processed. Pre-digested ideally. Just give me the AI summary. A tiktok or YouTube short will suffice. We get our information from hyper-processed, cream-of-the-algorithmic-crop content.
Insights are not discovered, they are simply repeated.
Contemplation is now just an appearance.
Why meditate when we have [Marcus Aurelius' (Wikipedia)](https://en.wikipedia.org/wiki/Meditations) cheat sheet?
I'm not arguing against access to information.
I do think one of the treasures we traded for infinite knowledge was our considering gaze.
@@ -0,0 +1,23 @@
---
date: 2026-05-05T01:09:56-06:00
description: "Having ritual and ceremony in a society highlights the intimate side in us."
# image: "/images/"
# image_caption: ""
# image_alt: ""
lastmod: 2026-05-05T01:23:09-06:00
showTableOfContents: false
tags: ["mormon","religion","ritual","ceremony"]
title: "The Importance of Ritual"
type: "post"
draft: false
---
I was talking to a friend recently about our shared history with the Mormon faith. They helped me realize something in reminiscing on Mormon temple ceremonies.
Being in an intimate setting with friends. Dressed in a different garb. Whispering in hushed tones used only in this setting. Quiet interrupted by the water sloshing in the large, tiled baptismal font. A setting to see into the soul of another.
What do they do when all is made eternal?
How do they hold themselves when the temple suspends their external identity?
I noticed that this is, unfortunately, something I have lost in stepping away from the church. I wish there was more ceremony in our culture.
@@ -0,0 +1,53 @@
---
date: 2026-05-31T22:02:28-06:00
description: "A thought I had on what each man and each woman ought to do."
# image: "/images/"
# image_caption: ""
# image_alt: ""
lastmod: 2026-05-31T22:59:04-06:00
showTableOfContents: false
tags: ["philosophy","masculinity", "femininity"]
title: "The Masculine and Feminine Mandates"
type: "post"
draft: false
---
> It is for each man to learn to listen, then to lead with their best judgement.
>
> It is for each woman to recognize and validate that which they have always known.
## Mandates Expanded
I had roughly these thoughts today at some point while stewing on my reading of [_Iron John_ (Wikipedia)](https://en.wikipedia.org/wiki/Iron_John:_A_Book_About_Men) by [Robert Bly (Wikipedia)](https://en.wikipedia.org/wiki/Robert_Bly). Obviously, I don't claim to say that this is an absolute for absolutely every man and woman. But it is what I think is true of myself, and the men and women I know intimately.
I thought I'd write it down in case it provided any sort of clarity to myself or others down the road.
## On Men and Me
I think for myself, as a man, I have learned from my upbringing and my environment an incredible amount of softness and passivity. Deference, kindness, compassion, traits my mother and sisters all taught me.
None of these are bad traits to have as a man. But I believe I lack many traits you might hope to find in a man.
One example: Leadership.
{{<aside caption="my thoughts">}}
Well it's rude to tell women what to do, wrong in fact. Especially so in my most intimate relationship. We as men must respect and believe women, because so few do, and so many are pigs. And what do I do when mine and my partner's opinions are at odds? Forcing my way of thinking onto her seems only a stone's throw from forcing my body onto her. So out with what I want.
{{</aside>}}
Effectively, I can never make a decision without weighing my partner's opinion with greater gravity than my own. Which can make me become simply a shadow.
I must say, my partner would be horrified to know anytime this happens. She is loath to obligate me to anything, even chores around the house. But, alas, this is a self-defeating thought process I have had many times.
How can a man lead in a world where it is mistaken for coercion? If the leader of our country is anything to go off of, the answer is not to. Don't lead your country, deceive it. Create a fog of lies and a web of phantoms so thick nobody feels the desire to wade through and find the truth. And sit right in the middle of it all. Small, still a boy underneath the pressed suits and cocktails. Limp, ducking under blame and consequence never standing for anything.
It seems evident to me that the "soft man"[^1] our culture has produced (in me and many of my kin) comes at a cost. We are so extremely tolerant of his despicable behavior. I do not feel that the "wild man"[^2] would put up with such abuse. This is where the soft man is being exploited and taken advantage of in our society.
I hope to welcome more of my wild man. Taking risks, hunting prey, providing safety and peace for my family.
I feel that I have much to say about the woman's aspect, and probably have said much to get torched on internet spheres, but I hope to merely express what I am thinking about. If I am flawed, please tell me so. I hope to always open my ears to dissent and hear truth wherever I find it.
Posting now so there is something rather than nothing :)
[^1]: Robert Bly covers the idea of the soft man coming to prominence post Industrial Revolution. Men and boys stopped working side-by-side, and instead boys were raised predominantly by their mothers. I find this line of thinking and this shift in boyhood fascinating. I recommend _Iron John_ even though I am only 30 pages in. I'm sure I will have a lot to say here as I continue.
[^2]: Also a Robert Bly-ism found in Iron John. Essentially the wild man points to the raw, the wet, the untapped core of a man. Not a savage brute, but a shaman, woodsman, or king.
@@ -0,0 +1,56 @@
---
date: 2026-06-02T23:35:33-06:00
description: "In the height of LLM's"
# image: "/images/"
# image_caption: ""
# image_alt: ""
lastmod: 2026-06-03T00:08:31-06:00
showTableOfContents: false
tags: ["ai","aesthetics","philosophy"]
title: "The 'Quality' of Ai"
type: "post"
draft: false
---
[The blog post that got me to put my words down](https://sinclairtarget.com/blog/2026/06/01/quality-in-the-age-of-slop/).
[Last year](../25-01-28-ai-hestiation-turning-around) I decided to give AI a shot. Previous to that, I had dabbled with the chat interfaces of Claude and ChatGPT, but
had resisted really diving in.
Just so no one doubts my 'allegiance', or to brand myself into the camp of water-boilers, over that time span I have:
- Fully vibe-coded a web-rtc baby monitor (flutter app and Go backend)
- I've vibe-coded or AI assisted many other projects, but that was the most substantial project that works.
- Paid for various subscription services (Claude) for said vibe coding
- Used tons of chatting with AI to plan projects, make recipes, research things on my mind
- At work, used Opencode to complete many of my work tickets, typically iterating in Plan mode, then executing said plan
- No Pr's were ever merged without some minor intervention as far as I recall, there was always a little something here or there that needed tweaking, but it definitely felt very productive.
- See-saw'd every week between "this is awesome" and "I'm pretty sure I'm getting dumber and need to stop"
I feel I have fully submerged myself in the slop swamp. What have I learned?
## LLM's are Excellent
Large Language Models are really cool piece of technology. I hope one day there is a fairly and freely (as in libre)
trained model to replace search. It is so nice to "describe" what you are searching when you only have the vagaries in
your mind. Turning English text prompts into random statistical output is a wildly cool idea.
_Unfortunately_
It is so very problematic.
## LLM's are Evil
I think my experiment with going all-in with LLM's has taught me just how insidious this technology can be. I believe it
has [wreaked havoc in many peoples' lives (Wikipedia)](https://en.wikipedia.org/wiki/Deaths_linked_to_chatbots). I feel
that the price a software engineer pays to have a prediction engine produce the code for them is steep. It erodes
personal expertise, cheapens the craft and love of the craft, sucks the enjoyment out of work, and steals the ability to make any large maintenance decisions with confidence.
I feel that my original aversion to these programs was right. The technology inserts itself (by default) in the loop, creating
dependence.
LLM's do not produce Quality, they cannot. So, I think I am done with AI code assistance. Rubber ducking and search still
seem very helpful to me, so I'm going to try and move to self-hosted models for those use-cases.
I want to continue to improve my craft. I want to love this craft. It's why I started down this road nearly ten years
ago in college.
+47
View File
@@ -0,0 +1,47 @@
---
title: "Terms of Use"
date: 2026-03-08
draft: false
type: "page"
showTableOfContents: false
---
## Copyright
All original content on fosscat.com — including text, images, code samples, and other
creative works — is copyright Nate Anderson. All rights reserved unless otherwise noted.
## Permitted Use
You are welcome to read, share, and link to any content on this site for personal,
non-commercial purposes. Quoting excerpts with proper attribution and a link back to the
original is encouraged.
## Prohibited Use
The following uses of content from this site are expressly prohibited without prior
written consent:
- **AI and machine learning model training** — using site content as training data,
fine-tuning material, or evaluation benchmarks for any AI or ML system
- **Data broker resale** — collecting, packaging, or reselling site content as part of a
data product or service
- **Market research products** — incorporating site content into commercial research
reports, databases, or analytics platforms
- **Ad-targeting and profiling** — using site content or visitor behavior to build
advertising profiles or audience segments
- **Any other commercial data exploitation** — automated or manual collection of site
content for any for-profit purpose not listed above
This prohibition applies regardless of the method of collection, whether by web scraper,
crawler, API, manual copying, or any other means.
## Acceptance
By accessing and browsing this site, you agree to be bound by these terms. If you do not
agree, you should discontinue use of the site immediately.
## Exceptions
If you would like to request an exception to these terms for a specific use case, please
contact [legal@fosscat.com](mailto:legal@fosscat.com).
+12 -2
View File
@@ -53,6 +53,7 @@
{{- partial "list-posts.html" . -}}
{{ end }}
{{ end }}
<a class="view-all" href="/posts/">View all posts &rarr;</a>
</div>
{{ $projects := where .Site.RegularPages "Params.type" "projects" }}
@@ -66,7 +67,8 @@
<div class="home-project-meta">
{{ with .Params.status }}
{{ $color := $project.Params.statusColor | default "#9e9e9e" }}
<span class="home-project-status" style="color: {{ $color }}; border: 1px solid {{ $color }}; background-color: {{ $color }}20;">{{ . }}</span>
<span class="home-project-status"
style="color: {{ $color }}; border: 1px solid {{ $color }}; background-color: {{ $color }}20;">{{ . }}</span>
&middot;
{{ end }}
Updated {{ $project.Lastmod.Format "Jan 2, 2006" }}
@@ -78,6 +80,14 @@
{{ end }}
</div>
{{ end }}
<div class="home-connect">
<p>
Subscribe via <a href="{{ "/index.xml" | absURL }}">RSS</a><a href="https://aboutfeeds.com/" class="rss-info" title="What is RSS?" aria-label="What is RSS?">?</a>,
send feedback to <a href="mailto:feedback@fosscat.com">feedback@fosscat.com</a>,
or check out the <a href="https://git.fosscat.com/n8r/fosscat-site">source code</a>.
</p>
</div>
{{ end }}
{{ end }}
+173 -25
View File
@@ -116,6 +116,52 @@ human_size() {
fi
}
# ---------------------------------------------------------------------------
# Manifest: track which images have been optimized (skip re-processing)
# ---------------------------------------------------------------------------
MANIFEST_FILE=".image-manifest"
manifest_hash() {
sha256sum "$1" | cut -d' ' -f1
}
# Look up a file's stored hash; prints it or empty string if not found
manifest_lookup() {
local file="$1"
if [[ -f "$MANIFEST_FILE" ]]; then
grep -F " $file" "$MANIFEST_FILE" 2>/dev/null | head -1 | awk '{print $1}' || true
fi
}
# Update or add a file's hash in the manifest
manifest_update() {
local file="$1"
local hash
hash=$(manifest_hash "$file")
if [[ ! -f "$MANIFEST_FILE" ]]; then
echo "# fosscat.com image optimization manifest — do not edit manually" > "$MANIFEST_FILE"
fi
# Remove existing entry for this file (if any)
if grep -qF " $file" "$MANIFEST_FILE" 2>/dev/null; then
grep -vF " $file" "$MANIFEST_FILE" > "${MANIFEST_FILE}.tmp"
mv "${MANIFEST_FILE}.tmp" "$MANIFEST_FILE"
fi
# Append new entry
echo "$hash $file" >> "$MANIFEST_FILE"
}
# Remove a file's entry from the manifest
manifest_remove() {
local file="$1"
if [[ -f "$MANIFEST_FILE" ]] && grep -qF " $file" "$MANIFEST_FILE" 2>/dev/null; then
grep -vF " $file" "$MANIFEST_FILE" > "${MANIFEST_FILE}.tmp"
mv "${MANIFEST_FILE}.tmp" "$MANIFEST_FILE"
fi
}
# ---------------------------------------------------------------------------
# Utility: confirm prompt (respects --yes and --dry-run)
# ---------------------------------------------------------------------------
@@ -394,6 +440,9 @@ phase_strip_metadata() {
exiftool -all= -overwrite_original "$img" 2>/dev/null
stripped=$((stripped + 1))
echo -e " ${GREEN}$fname${NC} — metadata stripped"
# Update manifest since file content changed
manifest_update "$img"
done
echo ""
@@ -423,6 +472,7 @@ phase_convert() {
echo -e " ${DIM}(dry-run) Would delete: $(basename "$img") ($(human_size "$fsize"))${NC}"
else
rm -f "$img"
manifest_remove "$img"
echo -e " ${RED}Deleted:${NC} $(basename "$img") ($(human_size "$fsize"))"
fi
done
@@ -430,12 +480,14 @@ phase_convert() {
fi
echo -e "${BOLD}Converting images to WebP (quality $WEBP_QUALITY, max ${MAX_WIDTH}x${MAX_HEIGHT})${NC}"
printf " %-40s %-12s %-12s %s\n" "FILENAME" "BEFORE" "AFTER" "SAVINGS"
printf " %-40s %-12s %-12s %s\n" "--------" "------" "-----" "-------"
printf " %-40s %-12s %-12s %s\n" "FILENAME" "BEFORE" "AFTER" "STATUS"
printf " %-40s %-12s %-12s %s\n" "--------" "------" "-----" "------"
local total_before=0
local total_after=0
local converted=0
local skipped=0
local resized_only=0
for img in "${image_files[@]}"; do
[[ -z "$img" ]] && continue
@@ -446,6 +498,7 @@ phase_convert() {
fname=$(basename "$img")
local ext="${fname##*.}"
local base="${fname%.*}"
local ext_lower
ext_lower=$(echo "$ext" | tr '[:upper:]' '[:lower:]')
local webp_path="$IMAGES_DIR/${base}.webp"
@@ -453,14 +506,33 @@ phase_convert() {
before_size=$(stat -c%s "$img" 2>/dev/null || stat -f%z "$img" 2>/dev/null)
total_before=$((total_before + before_size))
# --- Manifest-based skip logic ---
local current_hash stored_hash
current_hash=$(manifest_hash "$img")
stored_hash=$(manifest_lookup "$img")
if [[ "$ext_lower" == "webp" ]] && [[ "$current_hash" == "$stored_hash" ]] && [[ -n "$stored_hash" ]]; then
# Already optimized, hash unchanged — skip entirely
total_after=$((total_after + before_size))
skipped=$((skipped + 1))
printf " %-40s %-12s %-12s ${DIM}%s${NC}\n" \
"$fname" "$(human_size "$before_size")" "—" "already optimized"
continue
fi
if $DRY_RUN; then
echo -e " ${DIM}(dry-run) Would convert: $fname -> ${base}.webp${NC}"
# Estimate: assume 80% reduction for JPEGs, 70% for PNGs, 10% for existing WebP
if [[ "$ext_lower" == "webp" ]] && [[ -n "$stored_hash" ]] && [[ "$current_hash" != "$stored_hash" ]]; then
echo -e " ${DIM}(dry-run) $fname — edited, would check dimensions only${NC}"
elif [[ "$ext_lower" == "webp" ]] && [[ -z "$stored_hash" ]]; then
echo -e " ${DIM}(dry-run) $fname — new webp, would record in manifest${NC}"
else
echo -e " ${DIM}(dry-run) Would convert: $fname -> ${base}.webp${NC}"
fi
local est_after=$before_size
case "$ext_lower" in
jpg|jpeg) est_after=$((before_size / 5)) ;;
png) est_after=$((before_size / 3)) ;;
webp) est_after=$((before_size * 9 / 10)) ;;
webp) est_after=$before_size ;;
esac
total_after=$((total_after + est_after))
converted=$((converted + 1))
@@ -476,7 +548,47 @@ phase_convert() {
needs_resize=true
fi
# Determine the input for cwebp
# --- Already WebP (edited or new): skip lossy re-compression ---
if [[ "$ext_lower" == "webp" ]]; then
if $needs_resize; then
# Resize oversized WebP via ImageMagick (lossless resize, no re-encoding)
local tmp_resized
tmp_resized=$(mktemp /tmp/optimg_XXXXXX.webp)
magick "$img" -resize "${MAX_WIDTH}x${MAX_HEIGHT}>" "$tmp_resized"
local new_dims
new_dims=$(magick identify -format '%wx%h' "$tmp_resized")
mv "$tmp_resized" "$img"
info " Resized $fname: ${cur_width}x${cur_height} -> $new_dims"
resized_only=$((resized_only + 1))
fi
# Record in manifest (whether resized or just newly tracked)
manifest_update "$img"
local after_size
after_size=$(stat -c%s "$img" 2>/dev/null || stat -f%z "$img" 2>/dev/null)
total_after=$((total_after + after_size))
if $needs_resize; then
local savings=0
if (( before_size > 0 )); then
savings=$(( (before_size - after_size) * 100 / before_size ))
fi
printf " %-40s %-12s %-12s ${CYAN}%s${NC}\n" \
"$fname" "$(human_size "$before_size")" "$(human_size "$after_size")" "resized (${savings}%)"
elif [[ -z "$stored_hash" ]]; then
printf " %-40s %-12s %-12s ${GREEN}%s${NC}\n" \
"$fname" "$(human_size "$before_size")" "—" "recorded"
else
printf " %-40s %-12s %-12s ${CYAN}%s${NC}\n" \
"$fname" "$(human_size "$before_size")" "—" "updated (edited)"
fi
converted=$((converted + 1))
continue
fi
# --- Non-WebP image: full convert + compress pipeline ---
local cwebp_input="$img"
local tmp_resized=""
@@ -488,24 +600,17 @@ phase_convert() {
cwebp_input="$tmp_resized"
fi
# Convert to WebP via cwebp (handles JPEG/PNG/WebP input natively)
if [[ "$ext_lower" == "webp" ]] && [[ "$img" == "$webp_path" ]]; then
# Same input and output: use temp output
local tmp_webp
tmp_webp=$(mktemp /tmp/optimg_XXXXXX.webp)
cwebp -q "$WEBP_QUALITY" "$cwebp_input" -o "$tmp_webp" 2>/dev/null
mv "$tmp_webp" "$webp_path"
else
cwebp -q "$WEBP_QUALITY" "$cwebp_input" -o "$webp_path" 2>/dev/null
fi
# Convert to WebP via cwebp
cwebp -q "$WEBP_QUALITY" "$cwebp_input" -o "$webp_path" 2>/dev/null
# Cleanup temp file if we resized
[[ -n "$tmp_resized" ]] && rm -f "$tmp_resized"
# Step 3: Delete original if it's not already .webp
if [[ "$ext_lower" != "webp" ]]; then
rm -f "$img"
fi
# Delete original non-WebP source
rm -f "$img"
# Record the new WebP in the manifest
manifest_update "$webp_path"
local after_size
after_size=$(stat -c%s "$webp_path" 2>/dev/null || stat -f%z "$webp_path" 2>/dev/null)
@@ -529,16 +634,27 @@ phase_convert() {
echo ""
local total_savings=0
if (( total_before > 0 )); then
if (( total_before > 0 )) && (( total_after > 0 )); then
total_savings=$(( (total_before - total_after) * 100 / total_before ))
fi
info "Converted $converted image(s)"
info "Total: $(human_size $total_before) -> $(human_size $total_after) (${total_savings}% reduction)"
if (( skipped > 0 )); then
info "Skipped $skipped already-optimized image(s)"
fi
if (( resized_only > 0 )); then
info "Resized $resized_only edited image(s) (no re-compression)"
fi
info "Processed $converted image(s)"
if (( total_before > total_after )); then
info "Total: $(human_size $total_before) -> $(human_size $total_after) (${total_savings}% reduction)"
else
info "Total size: $(human_size $total_after)"
fi
# Save totals for summary
echo "$total_before" > /tmp/optimg_total_before.txt
echo "$total_after" > /tmp/optimg_total_after.txt
echo "$converted" > /tmp/optimg_converted.txt
echo "$skipped" > /tmp/optimg_skipped.txt
}
# ---------------------------------------------------------------------------
@@ -656,10 +772,11 @@ phase_summary() {
echo ""
fi
local total_before total_after converted
local total_before total_after converted skipped
total_before=$(cat /tmp/optimg_total_before.txt 2>/dev/null || cat /tmp/optimg_total_size.txt 2>/dev/null || echo 0)
total_after=$(cat /tmp/optimg_total_after.txt 2>/dev/null || echo 0)
converted=$(cat /tmp/optimg_converted.txt 2>/dev/null || echo 0)
skipped=$(cat /tmp/optimg_skipped.txt 2>/dev/null || echo 0)
local savings=0
if (( total_before > 0 )) && (( total_after > 0 )); then
@@ -667,10 +784,41 @@ phase_summary() {
fi
echo -e " Images processed: ${BOLD}$converted${NC}"
if (( total_after > 0 )); then
if (( skipped > 0 )); then
echo -e " Images skipped: ${BOLD}$skipped${NC} (already optimized)"
fi
if (( total_after > 0 )) && (( total_before > total_after )); then
echo -e " Size before: ${BOLD}$(human_size "$total_before")${NC}"
echo -e " Size after: ${BOLD}$(human_size "$total_after")${NC}"
echo -e " Total reduction: ${BOLD}${GREEN}${savings}%${NC}"
elif (( total_after > 0 )); then
echo -e " Total size: ${BOLD}$(human_size "$total_after")${NC}"
fi
# Clean up stale manifest entries (files that no longer exist)
if [[ -f "$MANIFEST_FILE" ]] && ! $DRY_RUN; then
local stale=0
local manifest_tmp
manifest_tmp=$(mktemp /tmp/optimg_manifest_XXXXXX.txt)
while IFS= read -r line; do
# Keep comment lines
if [[ "$line" == \#* ]]; then
echo "$line" >> "$manifest_tmp"
continue
fi
# Extract filename (second field, after hash + two spaces)
local entry_file
entry_file=$(echo "$line" | awk '{print $2}')
if [[ -z "$entry_file" ]] || [[ -f "$entry_file" ]]; then
echo "$line" >> "$manifest_tmp"
else
stale=$((stale + 1))
fi
done < "$MANIFEST_FILE"
mv "$manifest_tmp" "$MANIFEST_FILE"
if (( stale > 0 )); then
info "Removed $stale stale manifest entry/entries"
fi
fi
echo ""
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 767 KiB

After

Width:  |  Height:  |  Size: 765 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 445 KiB

After

Width:  |  Height:  |  Size: 442 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 KiB

After

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 391 KiB

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 599 KiB

After

Width:  |  Height:  |  Size: 596 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 533 KiB

After

Width:  |  Height:  |  Size: 530 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 526 KiB

After

Width:  |  Height:  |  Size: 524 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 KiB

After

Width:  |  Height:  |  Size: 449 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 875 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 KiB

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

+42
View File
@@ -0,0 +1,42 @@
# All content on fosscat.com is the work of its author.
# Scraping, crawling, or collecting content from this site for
# commercial purposes — including AI/ML model training, data brokerage,
# or any for-profit data exploitation — is expressly prohibited,
# regardless of whether your user-agent is listed below.
# AI and data scrapers — disallowed
User-agent: GPTBot
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: anthropic-ai
Disallow: /
User-agent: Claude-Web
Disallow: /
User-agent: Omgilibot
Disallow: /
User-agent: FacebookBot
Disallow: /
User-agent: Bytespider
Disallow: /
User-agent: DataForSeoBot
Disallow: /
User-agent: PetalBot
Disallow: /
# All other crawlers (search engines, etc.) — allowed
User-agent: *
Allow: /
Sitemap: https://fosscat.com/sitemap.xml
+5 -2
View File
@@ -1,10 +1,13 @@
---
date: {{ .Date }}
# description: ""
# image: ""
lastmod: {{ now.Format "2006-01-02" }}
# image: "/images/"
# image_caption: ""
# image_alt: ""
lastmod: {{ .Date }}
showTableOfContents: false
# tags: ["",]
title: "{{ replace .File.ContentBaseName `-` ` ` | title }}"
type: "post"
draft: false
---
+9
View File
@@ -172,6 +172,15 @@ pre {
border-top-color: var(--dark-tertiary-color);
}
.home-connect {
color: var(--dark-muted-color);
}
.rss-info {
border-color: var(--dark-muted-color);
color: var(--dark-muted-color) !important;
}
/* TODO: Check if this is needed or not */
/* Content links: dark mode color override */
+62 -11
View File
@@ -69,11 +69,11 @@ html {
}
body {
margin-bottom: 170px;
margin-bottom: 0;
}
body.blog-post.has-post-navigation {
margin-bottom: 80px;
margin-bottom: 0;
}
b,
@@ -301,15 +301,14 @@ a:hover .feather-sun {
/* FOOTER */
.footer {
bottom: 0;
color: inherit;
left: 0;
margin-left: 30%;
margin: 60px auto 0;
max-width: 600px;
overflow: hidden;
padding: 40px 0;
position: absolute;
padding: 40px 20px;
text-align: center;
width: 40%;
width: 100%;
box-sizing: border-box;
}
.footer span {
@@ -604,6 +603,16 @@ table td {
vertical-align: middle;
}
.view-all {
display: inline-block;
margin-top: 1.0rem;
font-size: 0.85rem;
text-decoration: none;
color: var(--accent-color);
border-top: 1px solid var(--light-secondary-color);
padding-top: 0.6rem;
}
.home-projects-card .view-all {
display: block;
margin-top: 0.8rem;
@@ -614,10 +623,49 @@ table td {
padding-top: 0.6rem;
}
.home-projects-card .view-all:hover {
.view-all:hover {
text-decoration: underline;
}
/* HOME CONNECT blurb */
.home-connect {
width: 80%;
margin: 2rem auto 0;
text-align: center;
font-size: 0.9rem;
color: var(--light-muted-color);
}
.home-connect a {
color: var(--accent-color);
text-decoration: none;
}
.home-connect a:hover {
text-decoration: underline;
}
.rss-info {
display: inline-block;
width: 1.1em;
height: 1.1em;
line-height: 1.1em;
text-align: center;
font-size: 0.7em;
font-weight: 700;
border-radius: 50%;
border: 1px solid var(--light-muted-color);
color: var(--light-muted-color) !important;
margin-left: 0.2em;
vertical-align: super;
text-decoration: none !important;
}
.rss-info:hover {
border-color: var(--accent-color);
color: var(--accent-color) !important;
}
/* SINGLE */
.post [role="doc-subtitle"] {
font-size: 1.1em;
@@ -855,6 +903,10 @@ table td {
min-width: unset;
}
.home-connect {
width: auto;
}
main#content .container {
width: 100%;
}
@@ -876,8 +928,7 @@ table td {
}
.footer {
margin-left: 0;
width: 100%;
padding: 40px 15px;
}
}
+32 -30
View File
@@ -1,39 +1,41 @@
<footer class="footer">
<!-- Option for user to inject custom html -->
{{ if .Site.Params.CustomFooterHTML }}
{{ .Site.Params.CustomFooterHTML | safeHTML }}
{{ end }}
<footer class="footer" style="margin-top: 20px;">
<!-- Option for user to inject custom html -->
{{ if .Site.Params.CustomFooterHTML }}
{{ .Site.Params.CustomFooterHTML | safeHTML }}
{{ end }}
{{ .Scratch.Set "footerText" "" }}
{{ .Scratch.Set "footerText" "" }}
{{ if (.Site.Params.Footer) }}
{{ if (.Site.Params.Footer) }}
{{ if and (eq .Kind "page") (.Date) }}
{{ .Scratch.Add "footerText" (.Date | time.Format "2006") }}
{{ else }}
{{ .Scratch.Add "footerText" (time.Now | time.Format "2006") }}
{{ end }}
{{ if and (eq .Kind "page") (.Date) }}
{{ .Scratch.Add "footerText" (.Date | time.Format "2006") }}
{{ else }}
{{ .Scratch.Add "footerText" (time.Now | time.Format "2006") }}
{{ end }}
{{ if and (eq .Kind "page") (.Lastmod) (gt (time.Format "2006" .Lastmod) (time.Format "2006" .Date)) }}
{{ .Scratch.Add "footerText" "-" }}
{{ .Scratch.Add "footerText" (.Lastmod | time.Format "2006") }}
{{ end }}
{{ if and (eq .Kind "page") (.Lastmod) (gt (time.Format "2006" .Lastmod) (time.Format "2006" .Date)) }}
{{ .Scratch.Add "footerText" "-" }}
{{ .Scratch.Add "footerText" (.Lastmod | time.Format "2006") }}
{{ end }}
{{ .Scratch.Add "footerText" " " }}
{{ .Scratch.Add "footerText" .Site.Params.Footer }}
{{ .Scratch.Add "footerText" " " }}
{{ .Scratch.Add "footerText" .Site.Params.Footer }}
{{ if and (eq .Kind "page") (.Site.Copyright) }}
{{ .Scratch.Add "footerText" " " }}
{{ .Scratch.Add "footerText" .Site.Copyright }}
{{ end }}
{{ if and (eq .Kind "page") (.Site.Copyright) }}
{{ .Scratch.Add "footerText" " " }}
{{ .Scratch.Add "footerText" .Site.Copyright }}
{{ end }}
{{ end }}
{{ end }}
{{ if (gt (.Scratch.Get "footerText" | len) 0) }}
<span>&copy; {{ .Scratch.Get "footerText" | markdownify }}</span>
{{ end }}
{{ if (gt (.Scratch.Get "footerText" | len) 0) }}
<span>&copy; {{ .Scratch.Get "footerText" | markdownify }}</span>
{{ end }}
<span>
Made with &#10084;&#65039; using <a target="_blank" href="https://github.com/gokarna-theme/gokarna-hugo">Gokarna</a>
</span>
</footer>
<span style="font-size: 0.85em; max-width: 600px; display: inline-block; line-height: 1.4; margin-top: 20px;">
&copy; Nate Anderson {{ now.Format "2006" }}. Content may be read and shared freely for personal use.
Commercial data collection is prohibited without written consent.
<a href="/terms/">Terms of Use</a>.
</span>
</footer>