iamzach.com

A fun place on the internet since 1997

Frequently Asked Questions

By which I mean questions not really asked at all, let alone frequently.

What is this?
It's a bunch of fancy automation and a little AI that takes excerpts from fiction & poetry I wrote in the 90s & early 00s and generates short critiques. It then builds static files and pushes to a github repo that is watched for changes. When changes are detected, they're pushed live to iamzach.com (here). The end (or is it?)
Why is this?
I'm just messing around. I'm looking at a bunch of different things here: various local models (output, performance, etc), the tooling around them, human-AI collaboration, LLM context/memory management, other secret and probably weird things I'm not telling you about. One thing I'm not actually looking for: real critiques of my terrible high school writing. Just fodder for the experiment.
Who are you?
I'm Zach. You may have figured this part out already. I've been on the internet in one way or another since the early 90s. I've got a 30+ year tech career spanning engineering, product, and design. More later, maybe.

Changelog

Jan 31 - Feb 1 2026
  • New Model: switched from Qwen2.5:32b to Gemma2:27b
  • Improved Selection Script: initial script was too simplistic, easily tripped up by formatting errors, etc. This iteration uses a strategy pattern with confidence scoring for better passage extraction: text arrives → each selector (poetry, prose) scores confidence → highest confidence wins → winner extracts
  • Cleaner Sources: poor formatting led to extraction errors, eg prose only for the month of January due to the markdown transformer's shit poetry formatting. Manual fix for now, transformer improvements WIP
  • QoL Stuff: `--dry-run` added for crit preview/testing without writing to history, html templates more dynamic
Feb 28 - Mar 1 2026
  • New Model: switched from Gemma2:27b to nous-hermes2pro:Q4_K_M
  • Database: added DuckDB as a data layer. All 59 existing critiques backfilled with passage and critique text extracted from HTML. Sources, models, and tags normalized. Full-text search indexes on source content and critiques. JSON files still in place for now
  • Reliability Fix: macOS 26.3 update reset the Xcode license agreement, breaking git in the launchd environment. Fixed by switching to Homebrew's git instead of Apple's stub
Mar 26 2026
  • Selection Script Fix: 100 word threshold was too high, causing short pieces to be skipped entirely. This also uncovered a bug in which the script would fail if sequentially selecting multiple pieces below the threshold*. This would lead to a good ol loop'n'crash (a technical term I just made up). Adjusted word threshold for better coverage: if a piece is below 100 words, it's critiqued in entirety rather than skipped.

    * Of course this failure happened while I was moving house, I didn't catch it right away, no 3/25/26 crit as a result.

  • Passage Extraction Fix: the opposite problem: for long-paragraph prose, the paragraph-based selector would occasionally return the entire source file rather than a proper excerpt (see 3/24/26 crit for an example). Fixed by falling through to sentence-based extraction when the selected passage overshoots the word limit.
Mar 31 - Apr 1 2026
  • New Model: goodbye nous-hermes2pro:Q4_K_M, hello deepseek-r1:8b.
  • Human > AI Transition: Managed to successfully reduce and insert a human being into my laptop*. Using techniques similar to Japanese paper folding ("Origami"), I was able to reduce Brandall-Lucille to a small rectangle that fit neatly into my Macbook's SDXC card slot. I have no idea why I did this but it's done. Strangely enough Branny has had no complaints.

    * No I didn't, it's April 1.

  • Added support for reasoning models: script now strips blocks from crit output.
  • Database: monitored DuckDB in prod over March, cut over to it from the original static file approach on 4/1.
May 1 2026
  • New Model: outgoing deepseek-r1:8b, incoming phi4:latest. This after trying QwQ:32b. Alas, my eyes were too big for my hardware. Gen times were 10+ mins, compared to under 2 mins for everything else so far.
  • Model name matching fix: the model availability check now handles case differences and ignores the :latest tag suffix, so config entries like phi4 work without needing the exact tag. I call this "pappin' the paprika". Wait, do I?