Timeline
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

50 most recent check-ins

2026-09-25
15:33
preserve exif metadata and timestamps when converting to jxl ImageMagick drops some metadata during JXL conversion, so copy everything (EXIF, XMP, IPTC, ICC) from the original with exiftool after converting and restore the file timestamps. JPEG COM comments have no home in JXL, so land them in XMP Description, or EXIF UserComment if Description is taken. Also trim the bloated comment blocks. leaf check-in: 21c35006a8 user: andrew tags: master, trunk
2026-08-30
18:06
update AGENTS and README for fossil repo

Replace git references (status/staging/amend/.gitignore) with fossil equivalents in AGENTS.md, note Fossil in README, and add missing git2fossil.fish to the scripts table. check-in: 423311c6b6 user: andrew tags: master, trunk

06:45
add git2fossil.fish to convert git repositories to fossil

Translates gitignore patterns into Fossil's ignore-glob setting, preserves ignored files on a hidden branch with --import-ignored, and sets the admin password to the repo name with a warning. check-in: 07a5bf35db user: sourcehut@lewman.us tags: master, trunk

2026-08-22
15:33
update the user agent to something more recent leaf check-in: d56e5f1322 user: sourcehut@lewman.us tags: origin/master, trunk
2026-08-15
03:43
darcs2fossil: set the current user's password to the repo name

The previous commit set the admin password to the repo name, but hardcoded user 'root'. Fossil creates the admin user as the current user, so the password reset failed. Use (whoami) to target the actual admin user and update the warning message. check-in: 6861634e39 user: sourcehut@lewman.us tags: origin/master, trunk

03:26
darcs2fossil: set admin password to repo name and warn about it

Fossil import creates a default root user with no password. Set that password to the repository basename so the repo is immediately usable, but print a yellow warning showing the insecure credentials and the fossil command to change them. check-in: cf2d5af32d user: sourcehut@lewman.us tags: origin/master, trunk

02:35
add darcs2fossil.fish to convert darcs repositories to fossil check-in: f9b80f2be6 user: sourcehut@lewman.us tags: origin/master, trunk
2026-07-28
02:24
README: add script index table and license section check-in: 8223226c12 user: sourcehut@lewman.us tags: origin/master, trunk
02:19
prismcat: inline hot-path functions for ~66x speedup

Each $(...) call in the per-character loop forked two subshells. Inlining step_state, rand_run, and color_at eliminates the forks, dropping 5000-line runtime from 109s to 1.3s. check-in: e3e3665739 user: sourcehut@lewman.us tags: origin/master, trunk

02:10
prismcat: refactor to functional style

Use readonly constants, pure functions that only read args and write stdout, explicit state threading through step_state, and isolate all I/O in main. Remove dead code (err_exit, add_esc, offset, opts). check-in: 0fd18504e4 user: sourcehut@lewman.us tags: origin/master, trunk

02:04
prismcat: fix shebang to bash since the script uses bashisms

Arrays, local, RANDOM, and C-style for loops are not POSIX sh. check-in: dac813a044 user: sourcehut@lewman.us tags: origin/master, trunk

01:59
add SPDX BSD-3-Clause license headers to all scripts

Skipped lolcat.sh which is MIT-licensed from Avi Halachmi (avih/shlolcat). check-in: 76609cebb3 user: sourcehut@lewman.us tags: origin/master, trunk

01:56
prismcat: update header comment to match new name check-in: 529b0fb94d user: sourcehut@lewman.us tags: origin/master, trunk
01:56
rename mistralcat.sh to prismcat.sh

The script is no longer mistral-generated; prismcat better reflects what it does (prism splits light into a rainbow, cat concatenates). check-in: 0162c90ee1 user: sourcehut@lewman.us tags: origin/master, trunk

01:54
mistralcat: use ROYGBIV palette with random per-color run lengths

Replace the full 256-color cycle (which included black and greyscale) with a 21-color palette from the 6x6x6 cube following red through violet. Each color holds for 1-5 characters before advancing, and the rainbow flows continuously across newlines instead of resetting per line. check-in: a425cd9b0c user: sourcehut@lewman.us tags: origin/master, trunk

01:44
mistralcat: pipe file args into the read loop so they aren't ignored check-in: 1f0b2db2e4 user: sourcehut@lewman.us tags: origin/master, trunk
01:01
izzy_apk_audit: replace sqlite/rss with append-only jsonl output check-in: 0e9f6efabf user: sourcehut@lewman.us tags: origin/master, trunk
2026-07-27
03:53
izzy_apk_audit: format rss descriptions with emoji and sections

Render each feed item with the same emoji, indentation, and section headers used in the terminal output so it is readable in an rss reader instead of a single text blob. check-in: f8aae0e495 user: sourcehut@lewman.us tags: origin/master, trunk

03:48
izzy_apk_audit: use OpenBSD jot for bounded random apk selection

Prefer jot(1) on OpenBSD to pick an index in the valid range directly, falling back to /dev/urandom with modulo on systems without jot. check-in: af7b0e1949 user: sourcehut@lewman.us tags: origin/master, trunk

03:46
izzy_apk_audit: pick apks with /dev/urandom instead of fish random

fish's random builtin is deterministic enough that cron-fired runs could keep selecting the same apk. Read 4 bytes from /dev/urandom and mod them into the index range for unbiased selection on OpenBSD and Linux. check-in: 08eedd4e8f user: sourcehut@lewman.us tags: origin/master, trunk

03:41
izzy_apk_audit: avoid reserved fish variable name "version"

"version" is a special variable in fish 4.x; using it as a local produced runtime warnings. Rename the locals to "appver". check-in: 50c1a9c8e4 user: sourcehut@lewman.us tags: origin/master, trunk

03:33
izzy_apk_audit: persist runs to sqlite and publish an rss feed

Each audit run is now recorded in izzy_apk_audit.sqlite3 along with per-mirror results, and the latest 25 runs are rendered as an RSS feed for public consumption. check-in: 30cdf467ed user: sourcehut@lewman.us tags: origin/master, trunk

2026-07-21
04:24
fix izzy_apk_audit on openbsd: use openssl instead of base64

openbsd ships no `base64` binary; openssl is already a hard dependency, so pipe `openssl dgst -binary` into `openssl base64`. check-in: e8b240de88 user: sourcehut@lewman.us tags: origin/master, trunk

04:20
make izzy_apk_audit portable and single-run

use cksum/openssl/fish random instead of sha256sum/xxd/shuf so it runs on OpenBSD too, and drop the built-in 2-12h sleep loop so scheduling can be handled externally by cron or a systemd timer. check-in: 8ba79e18f3 user: sourcehut@lewman.us tags: origin/master, trunk

04:07
first attempt at a script to check random apks on each izzy repo check-in: 8b00fcf856 user: sourcehut@lewman.us tags: origin/master, trunk
2026-05-31
19:03
sort snapshots newest-first so we keep the last 30, not the oldest 30 check-in: 2ba1ea310a user: sourcehut@lewman.us tags: origin/master, trunk
2026-05-23
20:11
simply script to check my own mirror check-in: fbf17770bd user: sourcehut@lewman.us tags: origin/master, trunk
2026-05-14
04:56
rewrite generate_openbsd_patch_histogram in fish

use htmlq for actual html parsing instead of regex grepping. count

  • elements with tags to handle both modern numbered patches and legacy security advisories. dynamically discover releases from errata index page so new openbsd versions are picked up automatically. use mktemp and clean up temp files on exit.
check-in: ea1b9bd66b user: sourcehut@lewman.us tags: origin/master, trunk
2026-05-06
06:37
fix up AGENTS for all the bots check-in: 08e44683f7 user: sourcehut@lewman.us tags: origin/master, trunk
06:33
rename usbmonitor to a txt file check-in: 2a90adae6d user: sourcehut@lewman.us tags: origin/master, trunk
06:32
update toggle_ipv6.sh to fish and name it properly check-in: 6ab09c5d48 user: sourcehut@lewman.us tags: origin/master, trunk
06:28
drop -t auto from unix_timestamp.jl shebang

trivial time() call doesn't need threading overhead check-in: 29a04ac685 user: sourcehut@lewman.us tags: origin/master, trunk

06:24
make unix_timestamp.jl executable; add --seconds flag

Previously a manual snippet. Now a standalone executable: - Default: outputs current time in milliseconds (Publii format) - -s / --seconds: outputs Unix epoch seconds (date +%s) check-in: deb96840cf user: sourcehut@lewman.us tags: origin/master, trunk

06:19
add publii_db_stats.jl: blog database analytics and charts

Analyzes a Publii SQLite database and produces terminal tables plus SVG charts for: - Posts per year, month, day-of-week, hour-of-day - Year-over-year posting growth rates - Gaps between consecutive posts - Word count averages, min/max, and bucket distributions - Link counts per post - Estimated reading time - Title statistics - Cumulative posts timeline

Requires a Publii db.sqlite path as the only argument. Outputs charts to ./blogstats_charts/. check-in: db2e8229ad user: sourcehut@lewman.us tags: origin/master, trunk

05:37
fix array index 0 error on first filesystem iteration

seq 0 emits 0, which Fish rejects since arrays are 1-indexed. Guard the inner loop with a count check to skip it when no filesystems have been seen yet. check-in: 62a0bca3d8 user: sourcehut@lewman.us tags: origin/master, trunk

05:32
keep 30 snapshots per filesystem instead of globally

Previously the 30-snapshot limit was applied across all filesystems combined within a dataset, meaning a child filesystem with few snapshots could have them pruned while another had many. Now each filesystem independently retains up to 30 snapshots.

Also fix the broken $0 in usage message by using (status basename). check-in: 59f1b7576d user: sourcehut@lewman.us tags: origin/master, trunk

04:54
add doas/sudo detection check-in: 4c3f2ba0ee user: sourcehut@lewman.us tags: origin/master, trunk
2026-04-30
07:12
AGENTS, the new README for agents. check-in: 842ce85b57 user: sourcehut@lewman.us tags: origin/master, trunk
2026-04-15
08:00
never delete @initial snapshots as they are used for initial backups and incrementals check-in: d67f2cb431 user: sourcehut@lewman.us tags: origin/master, trunk
2026-03-19
02:14
rename update_openbsd_patches to something more descriptive check-in: 1a53a41a8a user: sourcehut@lewman.us tags: origin/master, trunk
2026-03-18
21:48
drop the emoji for plaintext enjoyers check-in: ad2bfd77cd user: sourcehut@lewman.us tags: origin/master, trunk
21:45
update the year for the LICENSE check-in: 59dc828e46 user: sourcehut@lewman.us tags: origin/master, trunk
21:44
add the LICENSE for posterity check-in: 932a2588d5 user: sourcehut@lewman.us tags: origin/master, trunk
21:42
hack out a script that builds a histogram of patches by openbsd release that puts out a plaintext histogram txt file. check-in: 1964320256 user: sourcehut@lewman.us tags: origin/master, trunk
2026-01-16
07:17
fix: add improved ZFS snapshot cleanup script

Create v2 script that properly handles nested datasets and chronological ordering. - Use recursive snapshot discovery with -r flag - Sort snapshots by creation time to delete oldest first - Add proper error handling for destroy operations - Use pure fish array operations instead of external commands check-in: ff6a1b721d user: sourcehut@lewman.us tags: origin/master, trunk

2025-11-24
07:01
explain what unix_timestamp.jl does check-in: 798cf02e85 user: sourcehut@lewman.us tags: origin/master, trunk
07:00
reorganize the repo into archive and non-archive. check-in: 346c8891ff user: sourcehut@lewman.us tags: origin/master, trunk
06:49
change perms so we can run it check-in: f152217ca7 user: sourcehut@lewman.us tags: origin/master, trunk
06:48
rework the keep last to accept a zpool name as the only argument. confirm it is a valid name check-in: f3aba9e8e9 user: sourcehut@lewman.us tags: origin/master, trunk
05:42
major refactor of the script: 1. more portable to generic fish shell 2. better handling of file names with spaces 3. progress bar 4. more functions, less confusion 5. documentation of each function check-in: bf885e4038 user: sourcehut@lewman.us tags: origin/master, trunk