This document explains how to generate and publish beautiful HTML release notes for Sparkle updates.
SAM uses a two-tier release notes system:
- whats-new.json - Structured data with features, improvements, and descriptions
- HTML Release Notes - Generated from whats-new.json for Sparkle's release notes window
Add a new release entry to Resources/whats-new.json:
{
"releases": [
{
"version": "20251230.1",
"release_date": "December 30, 2025",
"introduction": "Brief summary of the release",
"highlights": [
{
"id": "unique-id",
"icon": "system.icon.name",
"title": "Feature Title",
"description": "What it does and why it matters"
}
],
"improvements": [
{
"id": "unique-id",
"icon": "system.icon.name",
"title": "Improvement Title",
"description": "What changed and why"
}
]
}
]
}./scripts/generate_release_notes.sh 20251230.1This creates release-notes/20251230.1.html with styled, formatted release notes.
-
Commit the generated HTML:
git add -f release-notes/20251230.1.html git commit -m "docs: add release notes for 20251230.1" git push -
Get the raw GitHub URL:
https://raw.githubusercontent.com/SyntheticAutonomicMind/SAM/main/release-notes/20251230.1.html -
Update
appcast.xmlto use this URL:<sparkle:releaseNotesLink> https://raw.githubusercontent.com/SyntheticAutonomicMind/SAM/main/release-notes/20251230.1.html </sparkle:releaseNotesLink>
- Enable GitHub Pages in repository settings
- Set source to
mainbranch,/docsfolder - Move generated HTML to
docs/release-notes/ - URL becomes:
https://syntheticautonomicmind.github.io/SAM/release-notes/20251230.1.html
The update_appcast.sh script currently generates inline HTML in the <description> tag with a link to GitHub releases.
To use generated HTML instead, modify update_appcast.sh to:
- Check for
release-notes/$VERSION.html - Extract just the
<body>content - Embed it in the
<description>CDATA section
The generate_release_notes.sh script:
- Reads
Resources/whats-new.json - Finds the release matching the version
- Generates styled HTML with:
- Apple-style typography and spacing
- Highlight sections (major features)
- Improvement sections (smaller changes)
- Responsive design
- Proper accessibility
The generated HTML uses:
-apple-systemfont stack for native macOS appearance- Blue accent color (#0071e3) matching Sparkle's default theme
- Semantic HTML5 structure
- Inline CSS (no external dependencies)
| File | Purpose | Committed? |
|---|---|---|
Resources/whats-new.json |
Source of truth for release notes | ✅ Yes |
scripts/generate_release_notes.sh |
HTML generator script | ✅ Yes |
release-notes/*.html |
Generated HTML files | ❌ No (gitignored by default) |
Note: HTML files are gitignored to avoid committing generated content. Commit them explicitly with -f if hosting on GitHub raw.
The .github/workflows/release.yml currently:
- Builds the app
- Signs and notarizes
- Generates appcast.xml with basic release notes (GitHub link)
To integrate HTML release notes:
Add these steps before "Update appcast.xml":
- name: Generate HTML Release Notes
run: |
VERSION=${{ steps.version.outputs.VERSION }}
./scripts/generate_release_notes.sh "$VERSION"
- name: Commit Release Notes
run: |
VERSION=${{ steps.version.outputs.VERSION }}
git add -f "release-notes/${VERSION}.html"
git commit -m "docs: add release notes for ${VERSION}"
git push origin HEAD:mainThen modify scripts/update_appcast.sh to use the generated HTML.
- Update
Info.plistversion - Update
Resources/whats-new.json - Generate HTML:
./scripts/generate_release_notes.sh 20251230.1 - Commit HTML (if hosting on GitHub):
git add -f release-notes/20251230.1.html - Build:
make build-release - Sign:
make sign-release - Update appcast:
./scripts/update_appcast.sh 20251230.1 dist/SAM-20251230.1.zip - Commit and push
To preview the generated HTML:
./scripts/generate_release_notes.sh 20251230.1
open release-notes/20251230.1.htmlThis opens the HTML in your default browser for review.
Sparkle displays release notes in a WebView when:
- User clicks "Check for Updates"
- Automatic update check finds a new version
The content can come from:
<description>tag (inline HTML/text)<sparkle:releaseNotesLink>(external URL)- Both (description shown first, then link)
<sparkle:releaseNotesLink>
https://github.com/SyntheticAutonomicMind/SAM/releases/tag/20251230.1
</sparkle:releaseNotesLink>Shows GitHub release page in embedded iframe (not ideal).
<description><![CDATA[
<h1>What's New in SAM 20251230.1</h1>
<div class="introduction">...</div>
<!-- Full formatted HTML from generator -->
]]></description>Displays rich, styled release notes directly in the update window.
Generate Markdown from whats-new.json for GitHub releases:
./scripts/generate_release_changelog.sh 20251230.1 > CHANGELOG.mdAdd language field to whats-new.json and generate localized HTML:
./scripts/generate_release_notes.sh 20251230.1 --lang frValidate whats-new.json structure:
./scripts/validate_release_notes.shSupport for feature screenshots in release notes.
Ensure the version in whats-new.json exactly matches the version you're generating for:
# Check what versions exist
jq '.releases[].version' Resources/whats-new.jsonInstall jq (JSON processor):
brew install jq- Check that the HTML is valid (open in browser)
- Ensure
<description>tag has<![CDATA[wrapper - Verify Sparkle can access the URL (if using external link)
VERSIONING.md- Version numbering schemeBUILDING.md- Build and release processscripts/update_appcast.sh- Appcast update script- Sparkle Documentation