highseam has one rule about new features: nothing ships without a site that will use it the same week. For most of its life that site has been PawScapes. The upside is that features get used on real content right away. The downside is that PawScapes finds the bugs first. Both are in the changelog, and this is the short version.

Built from what PawScapes needed

  • 1.1.0, media import. Designed against the PawScapes photo mirror rather than guessed at: identity by external key, never by URL, and adopting files already in storage. It then adopted all 7,954 photos.
  • 1.3.0, the focal point. "The media editor round, driven by a production field report": one original in storage, crops by hotspot, no variant uploads.
  • 1.5.2, the roadmap. The next wave of fields was re-ordered after a pressure-test against PawScapes' actual content. The repeater moved first, because consumers were typing JSON arrays into textareas by hand, and the gallery editor would be built on it.
  • 1.7.0, the link field. Built to replace the internal-link rewrite PawScapes had to run after renaming 94 URLs.

Broken on arrival, fixed by the next release

  • 1.3.0 half-landed. The hotspot picker worked; the crop previews never appeared, because PawScapes' copy of an admin stub predated the release. Nothing errored. 1.4.0 added npx highseam-init --check-stubs to make that drift visible, and a rule that every release lists the stubs it changes.
  • 1.5.0's aspect select couldn't be seen working. An editor could pick a crop for an image in rich text but not see it until the page rendered. 1.5.1 made the node preview show the exact crop the reader gets. The same release stopped using a filename as alt text, a fix PawScapes had made in its own renderer first.
  • Rich text inside blocks. Three releases in nine days, all found on PawScapes pages as editors started nesting blocks. 1.7.1: a rich-text field inside a block showed [object Object], and saving wrote that string over the content. 1.7.2: the same class of problem for rich-text, array and link fields in blocks inside rich text. 1.7.3: the same for embed, gallery, date and tag fields.
  • 1.7.5, compare versions. Older snapshots stored a cleared field as "", newer ones as null, so a save could report "Published At, Updated on" as changed when nothing had. Found on real data the day version compare shipped.

Not everything comes from PawScapes

  • 1.2.0 came from walking the quickstart cold, as a stranger would. The documented steps crashed a fresh app on its first npm run dev.
  • 1.2.1 came from building this site. highseam-init didn't add the dev database or secrets file to .gitignore, so a new project could commit user password hashes. It was reported by the highseam.com build and fixed in 1.2.1 on 7 August.
  • Today: refreshing this site for 1.7.5 found that SvelteKit 3, out since 1 October, falls outside highseam's peer range, so npm i highseam fails in a newly scaffolded app. The quickstart says so until a release fixes it.

Why it's written down

Every one of these is in the CHANGELOG with the site it came from and, where a stub changed, which file to re-copy. An upgrade is a read of the notes plus --check-stubs, not a guess. It's also why PawScapes can usually adopt a release the day it ships.