All notable changes to Cherry are documented here. Format follows Keep a Changelog; versioning follows SemVer once 0.1.0 ships.
Entries are terse one-liners linked to their PR: - Thing that changed. (#12)
[Unreleased]
Fixed
- Hex package hygiene ahead of the first real publish: dialyzer PLT caches no longer ship in the tarball; hexdocs carry the CherryBomb marks (sidebar logo plus the lockup bundled into the README via ExDoc assets, so docs are self-contained) and a grouped module sidebar; README gains a "Use from Elixir" section and reality-checked Status;
cherry.newscaffolds depend on the hex release matching the installer instead of the develop branch, and thecherry_newhex page gets a README. (#34, #35) - Pagefind search drawer rendered in document flow inside the nav, pushing the whole page down with an off-centre results column, a dead thumbnail gutter, browser-yellow highlight marks, and a search input that overflowed the viewport on mobile. Both themes now anchor the drawer as a token-themed overlay panel under the input (
showImages: false, internal scroll), and the header wraps at 44rem so search gets a full-width row on small screens. (#30)
Changed
gen.actionworkflows pin the build action to the release tag of the running cherry (holsee/cherry/action@v<version>) instead of@develop, so generated pipelines stop tracking a moving ref; the action README example pins tov0.1.0-rc.1and the TODO is gone. (#33)- CherryBomb brand assets (logo, mascot, wordmark, and all repo derivatives) are excluded from the MIT/Apache-2.0 dual license:
assets/LICENSEreserves them while permitting in-product display and nominative use; the hex package ships the notice alongside the theme's nav mark. (#30) - Site prose voice pass: no em dashes anywhere on cherrybomb.dev, all JSON code blocks fully pretty-printed. (#30)
Added
- Copy buttons on code blocks: a new
copy-code.jsisland in both official themes puts a hover-revealed (always visible on touch) copy button on everypreand anydata-copyelement, clipboard-API based, token-styled, print-hidden; islands are now compiled into both themes bynpm run buildand a sync test pins the copies byte-identical. (#31) - Search keyboard shortcut: Ctrl+K / ⌘K focuses the Pagefind input in both themes, and the placeholder advertises it per-platform. (#31)
nav:entries acceptposition: :start | :end(default:end), so configured items can lead the nav ahead of the built-ins; cherrybomb.dev puts Guides before Blog. (#31)- Landing page pitch pass: a "Not just a blog" section covering the portfolio timeline, story pages, and the JSON-Resume-backed
/cv, plus a brush-checked top-ten feature list (AI-agent-friendly CLI + skill included) replacing the poster wall. (#31) - cherrybomb.dev, the real thing: full brand pass on the dogfood site — cherrybomb theme + Pagefind search enabled, brand-derived favicon/apple-touch/OG-card/nav-mark assets, a poster-wall landing page with real CLI envelopes, and a core guide set (quick-start, authoring loop, verifier, themes, deploy, scripting & agents, upgrade), all
check --strictclean; Pages workflow gains the Node step Pagefind needs. (#29) - Site enablers the dogfood exposed: heading anchor links + GitHub-style
> [!NOTE]alerts (mdex, styled in both themes with zero new tokens), favicon-by-convention (static/favicon.ico|favicon.svg|apple-touch-icon.png→ head links viaCherry.Site.Icons),nav:config for custom nav items (broken-link-checked), apage_classbody class per section, andtwitter:cardupgrading tosummary_large_imagewhensocial_imageis set. (#28) - The cherry agent skill (
skills/cherry/, fizzy-cli layout): a canonicalSKILL.mdteaching agents the safe-start checks, the author → build → check → publish → deploy loop, structured-diagnostic handling, provenance-based theme management, and binary self-update — plus a command reference generated from the CLI verb registry and CI-gated against drift (mix run scripts/regen_skill.exs), with.claude/skills/and.agents/skills/pointer shims. New verbs cannot land without the skill teaching them. (#27) cherry upgrade: first-class self-update for the standalone binary (ADR 0007) — resolves the latest stable GitHub release (or--versionfor any tag, prereleases included), verifies this platform's asset againstSHA256SUMS, and swaps the running executable rustup-style;--checkreports without touching anything and works under mix too. Zero new deps (:httpc+ OS trust store). (#26)
[0.1.0-rc.1] — 2026-08-14
Added
- Standalone binary + release pipeline (ADR 0007): Burrito packaging (
Cherry.Binaryboots the CLI seam only inCHERRY_RELEASEbuilds), tag-gated release workflow with a five-target native-runner matrix, per-binary smoke tests,SHA256SUMS+ build-provenance attestation, prerelease-aware publishing, and real checksum-verifyinginstall.sh/install.ps1served from cherrybomb.dev;workflow_dispatchruns the whole matrix as a publish-nothing dry run. (#24) - Published build action (
holsee/cherry/action): composite GitHub Action doing toolchain setup, caching,cherry.build, andcherry.check(strict by default) in oneuses:step — GH Pages users never touch Elixir locally;gen.actionworkflows now wrap it, and CI exercises the action against a freshcherry.newsite on both OSes. (#23) - Optional Pagefind search:
search: "pagefind"incherry.exs— the new Post pipeline stage indexes the emitted site (npx pagefind), both official themes grow a token-styled search island only when enabled, and default builds stay byte-identical and dependency-free. (#22) mix cherry.new PATH(thecherry_newinstaller,installer/): scaffolds an agent-ready site — content dirs, config (including the Lumis NIF selection consumers must carry), first post,AGENTS.mddocumenting the operate loop, and a.claude/skills/publishskill; CI dogfoods a generated site withbuild+check --strictagainst every commit. (#21)cherry theme.diff: managed drift — every overlay's three-way status against the installed theme (current/auto_updatable/conflict/untracked),--applyre-ejects auto-updatable ones with fresh provenance, andcherry checkwarns on stale or untracked overlays. Frozen theme copies, answered. (#20)- JSON Feed:
feed.json(jsonfeed.org 1.1) alongside Atom with a discovery<link>on every page;cherry checknow verifies it too. (#19) - The machine surface: every content route now carries an
index.mdmarkdown mirror alongside itsindex.html(posts, pages, blog index, tag pages, portfolio timeline, stories, CV), plus a generated/llms.txtper the llmstxt.org convention with absolute links to the mirrors; unlisted pages keep their mirrors but stay out ofllms.txt, and mirrors never leak into the sitemap or feed. (#18) --jsoncontract audit: error envelopes now carry structureddetails(a failingcheck --strict --jsonreturns its diagnostics machine-readably, not just prose), and a registry-complete contract test proves every verb's success and error envelopes decode — new verbs cannot land without envelope coverage. (#17)cherry check: the verifier — builds in memory (writes nothing) and reports structured diagnostics (broken internal links, missing descriptions, images without alt text, duplicate titles, Atom feed sanity); errors exit 1,--strictpromotes warnings,--jsonfeeds the agent's build → check → fix loop. (#16)- The cherrybomb theme: second official theme carrying the brand — neon night wall by dark, poster paper by day, brush-stroke title, glowing code blocks — same contract and token API as the default, proving the swap is real;
cherry gen.theme NAME [--from THEME]scaffolds an editable site-local copy. (#15) cherry gen.projectandcherry gen.talk: portfolio scaffolds with valid frontmatter (build-clean as generated), duplicate refusal,--jsonfor agents. (#14)The CV view:
/cv/as an employer-shaped projection of the portfolio (cv: curation, weight ordering, curated bullets), evidence-backed skills derived from merged calendar spans and linked to story pages,/cv.jsonin JSON Resume format, print-first stylesheet (black-on-white, no chrome, no split entries), andvisibility: public | unlisted | offwith noindex/sitemap handling. (#13)- Portfolio views:
/portfolio/timeline (profile header, year-railed entries, open source as standing roles),/story/:tag/pages cross-linking positions/projects/talks/OSS/education with blog posts on one tag,PersonJSON-LD, nav that knows the portfolio exists, and blog tag pages linking to their story. (#12) - Portfolio data layer: typed collections (
portfolio/positions,projects,talks,oss,education) with introspectable schemas,portfolio.yamlprofile,cv:curation blocks, and domain structs (Position,Project,Talk,OpenSource,Education,Profile,CV,Link) materialised viaCherry.Portfolio.from_build/1; entries are data-only (no page routes). (#11) - cherrybomb.dev deploy: Pages workflow building
example/on push to main with CNAME; reserved/install.shand/install.ps1installer paths (ADR 0007). (#10) cherry gen.action: generates the GitHub Pages deploy workflow (build → upload → deploy,.nojekyll, CNAME for custom domains);example/dogfood site (the future cherrybomb.dev) now builds in every CI run. (#9)- Default-on SEO and machine surface: canonical/Open Graph/JSON-LD head block on every page, Atom
feed.xml,sitemap.xml,robots.txt;base_pathsupport so every emitted URL works under GitHub project pages, proven by a base-path matrix test. (#8) - Authoring loop:
cherry gen.post,cherry publish, andcherry serve(Bandit + watcher + SSE live reload, drafts included). (#7) - Default theme design: dual light/dark token palettes, class-linked syntax highlighting colored by theme tokens, no-flash theme toggle island (TS), token-discipline tests. (#6)
- Theme contract v1:
theme.exsmanifest, three-level lookup,theme.list/theme.which/theme.ejectwith provenance; default theme renders posts, blog index, tag pages, 404. (#5) - Typed collections: posts + pages with introspectable schemas (
mix cherry.schema), YAML frontmatter, MDEx GFM rendering, drafts/future filtering. (#4) - Build pipeline (load→validate→transform→layout→emit),
cherry.exssite config,mix cherry.build, golden-fixture harness, determinism gate. (#3) Cherry.CLI.run/1seam with verb registry,--jsonenvelopes, stable exit codes;mix cherry.versiontracer. (#2)- Library skeleton with
mix precommitgate, TS toolchain, and CI on ubuntu + windows. (#1) - Project constitution (AGENTS.md), design doc (DESIGN.md), ADRs 0001–0006, backlog.
- Dual MIT / Apache-2.0 license.
- End-state README with the Cherrybomb identity.
- Devcontainer reference environment (Elixir 1.20.2 / OTP 28 / Node 22, pinned).
- Minimal 0.0.1 package stub to claim
cherryon Hex (published). - Portfolio dual-view design: Careers-style timeline +
/cv/web CV, both projections of one dataset (DESIGN.md §4).
Fixed
- Date ordering everywhere dates entered sort keys:
%Date{}structs term-compare field-alphabetically (day before year), so feeds, the blog index, tag pages, the timeline, and skills could order Jan 15 above Feb 1; all sort keys now go throughDate.to_erl/1. (#19) - Byte-determinism of emitted JSON: atom-keyed map iteration follows atom-creation order and varies between VM runs, so
JSON.encode!output was not reproducible;feed.jsonandcv.jsonnow encode viaCherry.StableJSONwith sorted object keys (ADR 0005). (#19)