Compare commits

..

12 Commits

Author SHA1 Message Date
1d50502131 another lil update
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2026-01-07 21:56:15 -08:00
63c4125655 frenzy
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2026-01-07 21:44:33 -08:00
e9cfdd0c53 small updoot
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2026-01-07 21:30:25 -08:00
839de7cf97 rotato chip. I should do a local deploy before committing next time
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-12-24 14:57:58 -08:00
7ef3267f26 all the dashes
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-12-24 14:54:28 -08:00
78197278c2 dash not underscore 2025-12-24 14:52:54 -08:00
04a0730bab crate pic, updated image script
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-12-24 14:50:31 -08:00
bf7200fa6d image file types
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-12-24 14:30:18 -08:00
257d6a3797 minor changes
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-12-24 14:26:54 -08:00
e494afd914 forgot perms are committed
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-12-24 14:24:06 -08:00
10337f4d3d I actually want it in the root dir for consistency
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-12-24 14:23:12 -08:00
e3b4e566f7 ship script 2025-12-24 14:22:46 -08:00
11 changed files with 174 additions and 11 deletions

View File

@@ -5,7 +5,7 @@ draft: false
--- ---
Here you are: Here you are:
![bluster_pic](/img/bluster_pic.webp) ![bluster pic](/img/bluster-pic.webp)
I have six Raspberry Pi's networked together with a shared NAS. That Coral chip is mostly for manual fun for now, but expect an interactive site later. I have six Raspberry Pi's networked together with a shared NAS. That Coral chip is mostly for manual fun for now, but expect an interactive site later.
@@ -37,3 +37,6 @@ Notes on improvements:
- family site would still be fun. some kind of app too - family site would still be fun. some kind of app too
- still a great idea, turns out email on kubernetes is not trivial at the moment... - still a great idea, turns out email on kubernetes is not trivial at the moment...
- Set up PVCs and using the NVMe volume mount - Set up PVCs and using the NVMe volume mount
--- Updates:
You are now on a beelink EQ series running Omarchy (for fun) headless. Still K3s with a bunch of additions, and now with the power of Claude I can create an entire subdomain in less than five minutes- including checked in code, images on the registry, TLS, etc. It's amazing!

View File

@@ -0,0 +1,32 @@
---
title: "Frenzy"
date: 2026-01-07T21:36:32-08:00
draft: false
---
# YOU'RE NOT WORKING HARD ENOUGH
Hardstyle2 By Fred Again (et al) has been my motto lately, and I've been pumping out a lot of work on my "spare" time as my wife studies for the last two tests of her SE exam. I've been pumping out a lot of websites, both for external clients and for fun. Here are some:
- [airt.scottyah.com](https://airt.scottyah.com) (AI Art! I have AI develop their own web based art)
- [arvit.scottyah.com](https://arvit.scottyah.com) (Potential client, just showing a friend how easy it'd be to have a website for their side business)
- [awards.scottyah.com](https://awards.scottyah.com) I got an idea to give neighborhood awards out. This was early AI and needs some love
- [scottyah.com](https://scottyah.com),[blog.scottyah.com](https://blog.scottyah.com),[scotthatlen.com](https://scotthatlen.com) this blog
- [calbo.us](https://calbo.us) Please buy a towel
- [git.scottyah.com](https://git.scottyah.com) my git server
- [harbor.scottyah.com](https://harbor.scottyah.com) my image registry
- [obsidian.scottyah.com](https://obsidian.scottyah.com) I self host an autistic note-taking app, this is the backend api
- [paragliding.scottyah.com](https://paragliding.scottyah.com) Trying to create what I want in a forecasting site for my local paragliding site
- [secretsanta.scottyah.com](https://secretsanta.scottyah.com) I made a website for my family to do secret santas on
- [admin.pearfectname.app](https://admin.pearfectname.app) The next three are the latest project for a friend/client
- [dashboard.pearfectname.app](https://dashboard.pearfectname.app)
- [pearfectname.app](https://pearfectname.app)
- [vincedemo.scottyah.com](https://vincedemo.scottyah.com) Made this to show my coworker how my infrastructure works
- [woodpecker.scottyah.com](https://woodpecker.scottyah.com) Supposed to be CI/CD but honestly it's so buggy I might use Tekton
- [wweb.scottyah.com](https://wweb.scottyah.com) My wedding website, the start of self-hosting
There are a few more that I didn't really want to include yet.
Most of my work has been focused on my actual paying client- setting up a super sick smart home system from a cool dude I met at a Cursor networking event.
I also have been doing a lot to get a baby naming app into the app store. Apple took awhile to approve my developer account and I started going out of scope, and now have to work to get it deployable haha.

View File

@@ -1,7 +1,7 @@
--- ---
title: "Home Server" title: "Home Server"
date: 2025-12-17T15:42:08-08:00 date: 2025-12-17T15:42:08-08:00
draft: true draft: false
--- ---
So things have changed since the raspberry pi days. I got a beelink for @250 and it blows the 6 pi cluster out of the water in terms on compute and latency. I have installed k3s on it as well, but it's a bit upgraded as I have learned a lot more about kubernetes since the last go-round. So things have changed since the raspberry pi days. I got a beelink for @250 and it blows the 6 pi cluster out of the water in terms on compute and latency. I have installed k3s on it as well, but it's a bit upgraded as I have learned a lot more about kubernetes since the last go-round.

View File

@@ -28,3 +28,11 @@ My wife and I have been gathering abandoned toys on our morning walks for awhile
## Finished! ## Finished!
The box came out more lopsided than imagined, but it works great! It's been about a month and there have been multiple full cycles of toys. I'm thrilled that the community has been accepting of it, and that it hasn't been removed. The box came out more lopsided than imagined, but it works great! It's been about a month and there have been multiple full cycles of toys. I'm thrilled that the community has been accepting of it, and that it hasn't been removed.
## And Death
We ended up moving further away and went to the beach less, and the check-ins got to be more depressing, typically mostly trash and it was used more as a lost and found for kids socks. I kept putting toys in, but they would dissapear too quickly. I noticed there were usually toys I didn't add, but none would last more than a week.
One day I cam back, it was in its place but it looks like people tried to use it for their fire, but it must have burnt abysmally with all the waterproofing I did.
It was in an unsafe state, so I came by later and took it away. It was a fun experiment, but ultimately the sucky people beat out the good ones. I have no plans to make a new one here.
![burnt_crate](/img/burnt-crate.webp)

View File

@@ -9,7 +9,7 @@ I found myself unable to post consistent posts on X, so I did what any lazy prog
I had to spend more time getting an X developer account and API keys (selfies, gov ID scans, etc) than I spent having Claude draft up another k8s.yaml and dockerfile. I now have a configmap I try to keep full, and it posts daily at the schedule that it thought would have highest visibility. So far, nobody has liked or commented on a post so I'm still just talking to a brick wall, but now I'm doing it with \~~ t e c h n o l o g y ~~ I had to spend more time getting an X developer account and API keys (selfies, gov ID scans, etc) than I spent having Claude draft up another k8s.yaml and dockerfile. I now have a configmap I try to keep full, and it posts daily at the schedule that it thought would have highest visibility. So far, nobody has liked or commented on a post so I'm still just talking to a brick wall, but now I'm doing it with \~~ t e c h n o l o g y ~~
![person speaking to a brick wall](/img/brick_wall.png) ![person speaking to a brick wall](/img/brick-wall.webp)
Follow me as I try to find my niche [https://x.com/calboDev](https://x.com/calboDev) Follow me as I try to find my niche [https://x.com/calboDev](https://x.com/calboDev)

View File

@@ -4,7 +4,7 @@ date: 2023-06-02T21:12:46-07:00
draft: false draft: false
--- ---
![alt text](/img/tikka.png) ![tikka](/img/tikka.webp)
- Rifle: Tikka T3x Roughtech Ember in .308 win - Rifle: Tikka T3x Roughtech Ember in .308 win
- Scope: Leupold VX-3HD 4.5-14x40 - Scope: Leupold VX-3HD 4.5-14x40

View File

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 129 KiB

View File

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 KiB

View File

@@ -1,14 +1,26 @@
#!/bin/bash #!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")") SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
# Find all files of type PNG, JPEG, or TIFF # Find all files of type PNG, JPEG, TIFF, or HEIC
files=$(find $SCRIPT_DIR/../hugo-content/static/img/ -type f -iname "*.png" -o -iname "*.jpg" -o -iname "*.tif") files=$(find "$SCRIPT_DIR/../hugo-content/static/img/" -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.tif" -o -iname "*.tiff" -o -iname "*.heic" \))
# Loop through all the files in the directory # Loop through all the files in the directory
for file in $files; do for file in $files; do
# Convert the file to WEBP output="${file%.*}.webp"
cwebp -resize 1500 0 $file -o "${file%.*}.webp"
# Check if file is HEIC format
if [[ "$file" == *.heic ]] || [[ "$file" == *.HEIC ]]; then
# Convert HEIC to WebP using sips (built into macOS) and cwebp
temp_png="${file%.*}_temp.png"
sips -s format png "$file" --out "$temp_png" >/dev/null 2>&1
cwebp -resize 1500 0 "$temp_png" -o "$output"
rm "$temp_png"
else
# Convert other formats directly with cwebp
cwebp -resize 1500 0 "$file" -o "$output"
fi
# Delete old file # Delete old file
rm $file rm "$file"
done done

108
ship.sh Executable file
View File

@@ -0,0 +1,108 @@
#!/bin/bash
set -e
# Blog Build & Deploy Script
REGISTRY="harbor.scottyah.com"
NAMESPACE="scottyah"
IMAGE_NAME="blog"
FULL_IMAGE="${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}"
# Parse flags
BUILD_ONLY=false
DEPLOY_ONLY=false
while [[ $# -gt 0 ]]; do
case $1 in
--build-only)
BUILD_ONLY=true
shift
;;
--deploy-only)
DEPLOY_ONLY=true
shift
;;
-h|--help)
echo "Usage: ./ship.sh [OPTIONS]"
echo ""
echo "Build and deploy Blog to Kubernetes"
echo ""
echo "Options:"
echo " --build-only Only build and push Docker image"
echo " --deploy-only Only deploy to Kubernetes (skip build)"
echo " -h, --help Show this help message"
echo ""
echo "Examples:"
echo " ./ship.sh # Build and deploy"
echo " ./ship.sh --build-only # Only build"
echo " ./ship.sh --deploy-only # Only deploy"
exit 0
;;
*)
echo "Unknown option: $1"
echo "Use --help for usage information"
exit 1
;;
esac
done
# BUILD PHASE
if [ "$DEPLOY_ONLY" = false ]; then
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
# Tags
TAG_TIMESTAMP="${FULL_IMAGE}:${TIMESTAMP}"
TAG_LATEST="${FULL_IMAGE}:latest"
echo "🐦 Building Blog Docker image..."
echo "Registry: ${REGISTRY}"
echo "Image: ${FULL_IMAGE}"
echo "Timestamp: ${TIMESTAMP}"
echo ""
# Build image
echo "Building Docker image..."
docker build \
--network=host \
-t "${TAG_TIMESTAMP}" \
-t "${TAG_LATEST}" \
"."
echo ""
echo "✅ Build complete!"
echo ""
echo "Tagged as:"
echo " - ${TAG_TIMESTAMP}"
echo " - ${TAG_LATEST}"
echo ""
# Push images
echo "Pushing images to registry..."
docker push "${TAG_TIMESTAMP}"
docker push "${TAG_LATEST}"
echo ""
echo "🚀 Images pushed to Harbor registry!"
echo ""
fi
# DEPLOY PHASE
if [ "$BUILD_ONLY" = false ]; then
echo "🐦 Deploying Blog to Kubernetes..."
echo ""
# Apply Kubernetes configuration
echo "Applying Kubernetes configuration..."
kubectl apply -f "k8s.yaml"
echo ""
echo "Waiting for namespace to be ready..."
kubectl wait --for=condition=Ready --timeout=10s namespace/blog 2>/dev/null || true
echo ""
echo "✅ Deployment complete!"
echo ""
fi
if [ "$BUILD_ONLY" = false ] && [ "$DEPLOY_ONLY" = false ]; then
echo "✨ Build and deployment complete!"
fi