diff --git a/.agents/skills/release-notes/SKILL.md b/.agents/skills/release-notes/SKILL.md
new file mode 100644
index 00000000000..cb2ec87c71d
--- /dev/null
+++ b/.agents/skills/release-notes/SKILL.md
@@ -0,0 +1,102 @@
+---
+name: release-notes
+description: >
+ Generate or regenerate polished website release notes for SkiaSharp versions.
+ Fetches raw release data from GitHub, reads the template, and writes formatted
+ markdown pages to documentation/docfx/releases/.
+
+ Use this skill whenever the user asks to:
+ - Generate release notes for a version ("write release notes for 3.119.2")
+ - Regenerate or refresh release notes ("regenerate 3.119.x release notes")
+ - Format raw release data into the website template
+ - Update the release notes after publishing a new release
+
+ Triggers: "release notes for X", "regenerate release notes", "format release notes",
+ "update website release notes", "write release notes", "refresh release notes".
+
+ This skill is also called by the release-publish skill (Step 7) after annotating
+ a GitHub release. You don't need to be asked explicitly — if release-publish is
+ running and reaches Step 7, invoke this skill.
+---
+
+# Release Notes Skill
+
+Generate polished website release notes for one or more SkiaSharp versions.
+
+## Process
+
+### Step 1 — Determine versions
+
+Ask the user which version(s) to generate, or infer from context:
+- A specific version: `3.119.2`
+- Multiple versions: `3.119.0, 3.119.1, 3.119.2`
+- A range by minor: "all 3.119.x" — list files matching `documentation/docfx/releases/3.119.*.md`
+ and also check GitHub for any releases not yet on disk
+- If called from release-publish, the version is already known
+
+### Step 2 — Fetch raw data
+
+For each version, fetch the raw GitHub release data:
+
+```bash
+python3 .agents/skills/release-notes/scripts/generate-release-notes.py --version {X.Y.Z}
+```
+
+This outputs raw markdown to a temp directory. Multiple `--version` flags can be
+combined in one call. Read the output file(s) from the temp directory.
+
+### Step 3 — Read the template
+
+Read `documentation/docfx/releases/TEMPLATE.md`. This is a real example of a polished
+release notes page. Match its structure, tone, and formatting exactly.
+
+Determine each version's status from its raw data:
+- **Stable release**: has a "## Stable Release" section → header uses `Released {date}` + NuGet link + GitHub Release link
+- **Preview only**: only preview sections → header uses `Preview only` + NuGet preview link + GitHub Release link
+
+### Step 4 — Write polished pages
+
+For each version, write `documentation/docfx/releases/{X.Y.Z}.md` with polished content.
+If the file exists, replace its entire content — this is a full regeneration.
+
+Follow these rules:
+
+1. **Highlights** — 1-3 sentences. What's the story? Lead with the biggest changes.
+ Mention community contributors by linked name.
+
+2. **Skia engine** — If a "Bump skia" or "milestone" PR appears in the raw data,
+ list it first under an **Engine** category.
+
+3. **Categorize features** — Group by what they affect. Use sub-headers:
+ Engine, GPU & Rendering, API Surface, Text & Fonts, Platform, Security, etc.
+ Each item: **bold title** — description. ❤️ [@contributor](https://github.com/contributor) ([#NNN](url))
+
+4. **Community contributors** — Anyone not @mattleibow. Mark with ❤️ inline AND
+ in a Contributors table. **ALWAYS** link: `[@user](https://github.com/user)`.
+ Never write bare `@user` anywhere in the file.
+
+5. **Omit noise** — Skip version bumps, CI-only fixes, doc updates, workflow/skill changes.
+ If many, mention as: "Plus several CI and documentation improvements."
+
+6. **Breaking changes** — If any, list under `### ⚠️ Breaking Changes` after Highlights.
+
+7. **PR links** — Every item links to its PR.
+
+8. **Rollup at top** — Aggregate ALL changes across all previews into the main sections.
+
+9. **Previews are minimal** — One sentence + changelog link each, at the bottom.
+
+10. **Links section** — Full Changelog, NuGet Package, API Diff.
+
+### Step 5 — Update TOC and index
+
+After writing all version files:
+
+```bash
+python3 .agents/skills/release-notes/scripts/generate-release-notes.py --update-toc
+```
+
+## Parallelization
+
+When regenerating multiple versions, process them in parallel — each version is independent.
+Fetch all raw data in one script call, then launch one agent per version to write the polished page.
diff --git a/.agents/skills/release-notes/scripts/generate-release-notes.py b/.agents/skills/release-notes/scripts/generate-release-notes.py
new file mode 100644
index 00000000000..7ecf262b7ab
--- /dev/null
+++ b/.agents/skills/release-notes/scripts/generate-release-notes.py
@@ -0,0 +1,470 @@
+#!/usr/bin/env python3
+"""
+Fetch SkiaSharp release data and manage the website release notes structure.
+
+This script collects raw data. AI does the formatting using TEMPLATE.md.
+
+Commands:
+ # Fetch raw release data for specific version(s) → temp dir
+ python3 .agents/skills/release-notes/scripts/generate-release-notes.py --version 3.119.2
+
+ # Fetch raw release data for the last N versions → temp dir
+ python3 .agents/skills/release-notes/scripts/generate-release-notes.py --last 5
+
+ # Fetch unreleased PRs (commits on main not in the last release tag) → temp dir or stdout
+ python3 .agents/skills/release-notes/scripts/generate-release-notes.py --unreleased
+
+ # Regenerate TOC.yml and index.md from files on disk + create upcoming version file
+ python3 .agents/skills/release-notes/scripts/generate-release-notes.py --update-toc
+
+Requirements: gh (GitHub CLI), git, Python 3.7+
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+import re
+import subprocess
+import sys
+import tempfile
+from collections import defaultdict
+from pathlib import Path
+from typing import Optional
+
+
+REPO = "mono/SkiaSharp"
+RELEASES_DIR = Path("documentation/docfx/releases")
+
+
+# ── Helpers ──────────────────────────────────────────────────────────
+
+
+def run(args: list[str], check: bool = True) -> str:
+ """Run a command and return stdout."""
+ result = subprocess.run(args, capture_output=True, text=True, check=check)
+ return result.stdout.strip()
+
+
+def gh(args: list[str]) -> str:
+ """Run a gh CLI command and return stdout."""
+ return run(["gh"] + args)
+
+
+def extract_base_version(tag: str) -> str:
+ """v3.119.2-preview.2.3 -> 3.119.2"""
+ return tag.lstrip("v").split("-")[0]
+
+
+def minor_group(version: str) -> str:
+ """3.119.2 -> 3.119"""
+ parts = version.split(".")
+ return f"{parts[0]}.{parts[1]}" if len(parts) >= 2 else parts[0]
+
+
+def version_key(version: str) -> list[int]:
+ """Sortable key from version string."""
+ return [int(n) for n in re.findall(r"\d+", version)]
+
+
+def get_upcoming_version() -> Optional[str]:
+ """Read SKIASHARP_VERSION from azure-templates-variables.yml."""
+ path = Path("scripts/azure-templates-variables.yml")
+ if path.exists():
+ for line in path.read_text().splitlines():
+ m = re.match(r"\s*SKIASHARP_VERSION:\s*(\S+)", line)
+ if m:
+ return m.group(1)
+ return None
+
+
+# ── Released version data ────────────────────────────────────────────
+
+
+def fetch_all_releases() -> list[dict]:
+ """Fetch the release list from GitHub."""
+ raw = gh(["release", "list", "--repo", REPO, "--limit", "300",
+ "--json", "tagName,name,isPrerelease,publishedAt"])
+ return json.loads(raw)
+
+
+def fetch_release_body(tag: str) -> dict:
+ """Fetch the full release body for a tag."""
+ try:
+ raw = gh(["release", "view", tag, "--repo", REPO,
+ "--json", "body,publishedAt,name,isPrerelease"])
+ return json.loads(raw)
+ except subprocess.CalledProcessError:
+ return {"body": "", "publishedAt": "", "name": tag, "isPrerelease": False}
+
+
+def group_by_base(releases: list[dict]) -> dict[str, list[dict]]:
+ """Group releases by base version."""
+ grouped = defaultdict(list)
+ for rel in releases:
+ base = extract_base_version(rel["tagName"])
+ grouped[base].append(rel)
+ return grouped
+
+
+def generate_raw_version_page(base_version: str, releases: list[dict]) -> str:
+ """Generate raw markdown for a version — stable first, then previews descending."""
+
+ def sort_key(r):
+ tag = r["tag"]
+ if "-" not in tag:
+ return (0,)
+ nums = re.findall(r"\d+", tag.split("-", 1)[1])
+ return (1,) + tuple(-int(n) for n in nums)
+
+ releases.sort(key=sort_key)
+ lines = [f"# Version {base_version}", ""]
+
+ for i, rel in enumerate(releases):
+ if i > 0:
+ lines.extend(["", "---", ""])
+
+ name = rel.get("name", "") or rel["tag"]
+ date = rel.get("publishedAt", "")
+ is_pre = rel.get("isPrerelease", False)
+ body = rel.get("body", "") or ""
+
+ title = name if is_pre else "Stable Release"
+ date_part = f" ({date[:10]})" if date else ""
+ lines.append(f"## {title}{date_part}")
+ lines.append("")
+ lines.append(body.rstrip() if body.strip() else "*No release notes available.*")
+ lines.append("")
+
+ return "\n".join(lines)
+
+
+# ── Unreleased data ─────────────────────────────────────────────────
+
+
+def find_baseline_tag(upcoming_version: Optional[str]) -> str:
+ """Find the correct baseline tag for unreleased diff.
+
+ Gets all release tags, parses as semver, and finds the highest tag
+ whose base version is <= the upcoming version. This correctly handles
+ the case where a v3 hotfix is tagged after a v4 preview — we still
+ pick the v4 preview as the baseline for v4 unreleased work.
+
+ The tag may be on a release/* branch (not main), but git log
+ {tag}..origin/main still works correctly because release branches
+ fork from main.
+ """
+ raw = gh(["release", "list", "--repo", REPO, "--limit", "100",
+ "--json", "tagName"])
+ tags = [r["tagName"] for r in json.loads(raw)]
+
+ if not tags:
+ raise RuntimeError("No releases found")
+
+ if not upcoming_version:
+ tags.sort(key=lambda t: version_key(t.lstrip("v")), reverse=True)
+ return tags[0]
+
+ upcoming_key = version_key(upcoming_version)
+
+ # Filter to tags whose base version is <= upcoming, then pick the highest
+ candidates = []
+ for tag in tags:
+ key = version_key(tag.lstrip("v"))
+ if key <= upcoming_key:
+ candidates.append((key, tag))
+
+ if not candidates:
+ tags.sort(key=lambda t: version_key(t.lstrip("v")), reverse=True)
+ return tags[0]
+
+ candidates.sort(key=lambda x: x[0], reverse=True)
+ return candidates[0][1]
+
+
+def get_unreleased_prs(tag: str) -> list[dict]:
+ """Find PRs from commits on main that are not in the release tag."""
+ run(["git", "fetch", "origin", "main", "--quiet"], check=False)
+ run(["git", "fetch", "origin", "tag", tag, "--quiet"], check=False)
+
+ log = run(["git", "log", "--oneline", f"{tag}..origin/main"])
+
+ pr_numbers = []
+ for line in log.splitlines():
+ m = re.search(r"\(#(\d+)\)\s*$", line)
+ if m:
+ pr_numbers.append(int(m.group(1)))
+
+ if not pr_numbers:
+ return []
+
+ prs = []
+ total = len(pr_numbers)
+ for i, num in enumerate(pr_numbers, 1):
+ try:
+ raw = gh(["pr", "view", str(num), "--repo", REPO,
+ "--json", "title,author,url,number,labels,mergedAt"])
+ prs.append(json.loads(raw))
+ except (subprocess.CalledProcessError, json.JSONDecodeError):
+ continue
+ if i % 20 == 0:
+ print(f" Fetched {i}/{total} PRs...", file=sys.stderr)
+
+ return prs
+
+
+def generate_raw_unreleased(prs: list[dict], tag: str) -> str:
+ """Generate raw unreleased PR list — just data, no formatting."""
+ if not prs:
+ return "*No unreleased changes.*\n"
+
+ lines = [f"Unreleased changes on `main` since `{tag}`:", ""]
+ for pr in prs:
+ title = pr.get("title", "")
+ author = pr.get("author", {}).get("login", "unknown")
+ url = pr.get("url", "")
+ number = pr.get("number", "")
+ label_names = [l.get("name", "") for l in pr.get("labels", [])]
+ labels_str = f" [{', '.join(label_names)}]" if label_names else ""
+
+ lines.append(f"- {title} by @{author} in {url}{labels_str}")
+
+ lines.append("")
+ return "\n".join(lines)
+
+
+# ── TOC and index generation ────────────────────────────────────────
+
+
+def get_version_files() -> list[str]:
+ """List version strings from existing markdown files."""
+ versions = []
+ for f in RELEASES_DIR.iterdir():
+ if f.suffix == ".md" and f.name not in ("index.md", "TEMPLATE.md"):
+ versions.append(f.stem)
+ versions.sort(key=version_key, reverse=True)
+ return versions
+
+
+def generate_toc(versions: list[str]) -> str:
+ """Generate TOC.yml grouped by major.minor, obsolete under one node."""
+ groups = defaultdict(list)
+ for v in versions:
+ groups[minor_group(v)].append(v)
+
+ current = []
+ obsolete = []
+ for g in sorted(groups.keys(), key=lambda x: version_key(x), reverse=True):
+ if int(g.split(".")[0]) < 3:
+ obsolete.append(g)
+ else:
+ current.append(g)
+
+ lines = ["- name: Overview", " href: index.md"]
+
+ for g in current:
+ members = groups[g]
+ lines.append(f"- name: Version {g}.x")
+ lines.append(f" href: {members[0]}.md")
+ lines.append(f" items:")
+ for v in members:
+ lines.append(f" - name: Version {v}")
+ lines.append(f" href: {v}.md")
+
+ if obsolete:
+ lines.append(f"- name: Obsolete Versions")
+ lines.append(f" href: {groups[obsolete[0]][0]}.md")
+ lines.append(f" items:")
+ for g in obsolete:
+ members = groups[g]
+ lines.append(f" - name: Version {g}.x")
+ lines.append(f" href: {members[0]}.md")
+ if len(members) > 1:
+ lines.append(f" items:")
+ for v in members:
+ lines.append(f" - name: Version {v}")
+ lines.append(f" href: {v}.md")
+
+ return "\n".join(lines) + "\n"
+
+
+def generate_index(versions: list[str], upcoming: Optional[str]) -> str:
+ """Generate index.md with version list grouped by major."""
+ lines = [
+ "# Release Notes",
+ "",
+ "Release notes for all SkiaSharp versions.",
+ "",
+ ]
+
+ major_groups = defaultdict(list)
+ for v in versions:
+ major_groups[v.split(".")[0]].append(v)
+
+ for major in sorted(major_groups.keys(), key=int, reverse=True):
+ lines.extend([f"### SkiaSharp {major}.x", ""])
+
+ minor_groups = defaultdict(list)
+ for v in major_groups[major]:
+ minor_groups[minor_group(v)].append(v)
+
+ for g in sorted(minor_groups.keys(), key=lambda x: version_key(x), reverse=True):
+ members = minor_groups[g]
+ lines.append(f"- **Version {g}.x**")
+ for v in members:
+ tag = " (Upcoming)" if v == upcoming else ""
+ lines.append(f" - [Version {v}{tag}]({v}.md)")
+ lines.append("")
+
+ return "\n".join(lines)
+
+
+def ensure_upcoming_file(version: str) -> bool:
+ """Create upcoming version file if it doesn't exist. Returns True if created."""
+ path = RELEASES_DIR / f"{version}.md"
+ if path.exists():
+ return False
+
+ path.write_text(
+ f"# Version {version}\n\n"
+ f"> **Upcoming release** · In development · Not yet available on NuGet\n\n"
+ f"*No changes yet.*\n"
+ )
+ print(f" Created {path}")
+ return True
+
+
+# ── Main ─────────────────────────────────────────────────────────────
+
+
+def cmd_update_toc():
+ """Regenerate TOC.yml and index.md, create upcoming version file if needed."""
+ if not RELEASES_DIR.is_dir():
+ print(f"Error: {RELEASES_DIR} does not exist", file=sys.stderr)
+ sys.exit(1)
+
+ upcoming = get_upcoming_version()
+ if upcoming:
+ ensure_upcoming_file(upcoming)
+
+ versions = get_version_files()
+
+ (RELEASES_DIR / "TOC.yml").write_text(generate_toc(versions))
+ print(f"Updated {RELEASES_DIR / 'TOC.yml'}")
+
+ (RELEASES_DIR / "index.md").write_text(generate_index(versions, upcoming))
+ print(f"Updated {RELEASES_DIR / 'index.md'}")
+
+
+def cmd_fetch_versions(target_versions: set[str], output_dir: Path):
+ """Fetch raw release data for specific versions."""
+ print(f"Fetching release list from {REPO}...", file=sys.stderr)
+ releases = fetch_all_releases()
+ grouped = group_by_base(releases)
+
+ missing = target_versions - set(grouped.keys())
+ if missing:
+ print(f"Warning: not found on GitHub: {', '.join(sorted(missing))}", file=sys.stderr)
+
+ tags_to_fetch = []
+ for base in target_versions & set(grouped.keys()):
+ for rel in grouped[base]:
+ tags_to_fetch.append((base, rel["tagName"]))
+
+ print(f"Fetching {len(tags_to_fetch)} release(s)...", file=sys.stderr)
+ fetched = defaultdict(list)
+ for i, (base, tag) in enumerate(tags_to_fetch, 1):
+ details = fetch_release_body(tag)
+ details["tag"] = tag
+ fetched[base].append(details)
+ if i % 10 == 0:
+ print(f" {i}/{len(tags_to_fetch)}...", file=sys.stderr)
+
+ output_dir.mkdir(parents=True, exist_ok=True)
+ for base, rels in fetched.items():
+ path = output_dir / f"{base}.md"
+ path.write_text(generate_raw_version_page(base, rels))
+ print(f" {path}")
+
+ print(f"\nDone: {len(fetched)} version(s) in {output_dir}/", file=sys.stderr)
+
+
+def cmd_unreleased(output_path: Optional[Path]):
+ """Fetch unreleased PRs and output raw list."""
+ upcoming = get_upcoming_version()
+ print(f"Upcoming version: {upcoming or 'unknown'}", file=sys.stderr)
+
+ print("Finding baseline tag...", file=sys.stderr)
+ tag = find_baseline_tag(upcoming)
+ print(f"Baseline: {tag}", file=sys.stderr)
+
+ print("Finding unreleased PRs via commit ancestry...", file=sys.stderr)
+ prs = get_unreleased_prs(tag)
+ print(f"Found {len(prs)} PR(s)", file=sys.stderr)
+
+ content = generate_raw_unreleased(prs, tag)
+
+ if output_path:
+ output_path.parent.mkdir(parents=True, exist_ok=True)
+ output_path.write_text(content)
+ print(f"Wrote {output_path}", file=sys.stderr)
+ else:
+ print(content)
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Fetch SkiaSharp release data for the website",
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ epilog=(
+ "Examples:\n"
+ " %(prog)s --version 3.119.2 Fetch one version\n"
+ " %(prog)s --last 5 Fetch 5 most recent versions\n"
+ " %(prog)s --unreleased Unreleased PRs to stdout\n"
+ " %(prog)s --unreleased -o /tmp/u.md Unreleased PRs to file\n"
+ " %(prog)s --update-toc Regenerate TOC + index\n"
+ ),
+ )
+ parser.add_argument("--version", action="append", dest="versions",
+ help="Fetch specific version(s). Repeatable.")
+ parser.add_argument("--last", type=int, help="Fetch the N most recent versions")
+ parser.add_argument("--unreleased", action="store_true",
+ help="Fetch unreleased PRs since last tag")
+ parser.add_argument("--update-toc", action="store_true",
+ help="Regenerate TOC.yml + index.md")
+ parser.add_argument("-o", "--output", help="Output directory (versions) or file (unreleased)")
+ args = parser.parse_args()
+
+ # Must specify exactly one mode
+ modes = sum([bool(args.versions), bool(args.last), args.unreleased, args.update_toc])
+ if modes == 0:
+ parser.print_help()
+ sys.exit(1)
+ if modes > 1:
+ parser.error("Specify only one of --version, --last, --unreleased, --update-toc")
+
+ if args.update_toc:
+ cmd_update_toc()
+
+ elif args.unreleased:
+ cmd_unreleased(Path(args.output) if args.output else None)
+
+ elif args.versions:
+ output = Path(args.output) if args.output else Path(tempfile.mkdtemp(prefix="skiasharp-releases-"))
+ cmd_fetch_versions(set(args.versions), output)
+
+ elif args.last:
+ releases = fetch_all_releases()
+ grouped = group_by_base(releases)
+ base_dates = {}
+ for base, rels in grouped.items():
+ dates = [r.get("publishedAt", "") for r in rels if r.get("publishedAt")]
+ base_dates[base] = max(dates) if dates else ""
+ recent = sorted(base_dates, key=lambda b: base_dates[b], reverse=True)[:args.last]
+
+ output = Path(args.output) if args.output else Path(tempfile.mkdtemp(prefix="skiasharp-releases-"))
+ cmd_fetch_versions(set(recent), output)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/.agents/skills/release-publish/SKILL.md b/.agents/skills/release-publish/SKILL.md
index d1d063f7131..7065de37b52 100644
--- a/.agents/skills/release-publish/SKILL.md
+++ b/.agents/skills/release-publish/SKILL.md
@@ -42,7 +42,8 @@ Publish packages to NuGet.org and finalize releases.
│ 4. Tag Release → Push git tag (ask_user first!) │
│ 5. Create GitHub Release→ Generate notes, set prerelease flag │
│ 6. Annotate Notes → Add platform/contributor emojis │
-│ 7. Close Milestone → Stable releases only │
+│ 7. Update Website → Regenerate release notes for website │
+│ 8. Close Milestone → Stable releases only │
└────────────────────────────────────────────────────────────────────┘
```
@@ -250,7 +251,23 @@ After creating the release, annotate each PR line with **platform** and **commun
---
-## Step 7: Close Milestone (Stable only)
+## Step 7: Update Website Release Notes
+
+After annotating the GitHub release, invoke the **release-notes** skill to update the
+website. Pass it the version you just released (e.g., "generate release notes for 3.119.2").
+
+The skill handles fetching raw data, formatting with the template, and updating the TOC.
+After the skill finishes, commit and push:
+
+```bash
+git add documentation/docfx/releases/
+git commit -m "Update website release notes for {tag}"
+git push
+```
+
+---
+
+## Step 8: Close Milestone (Stable only)
**Skip for preview releases.**
diff --git a/.github/workflows/update-release-notes.lock.yml b/.github/workflows/update-release-notes.lock.yml
new file mode 100644
index 00000000000..0df13036a18
--- /dev/null
+++ b/.github/workflows/update-release-notes.lock.yml
@@ -0,0 +1,1297 @@
+# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"24325d028d7b82de6adb7e5b587cd99cd42873312005fe0074fd9ab31b20a99b","compiler_version":"v0.68.3","strict":true,"agent_id":"copilot"}
+# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"373c709c69115d41ff229c7e5df9f8788daa9553","version":"v9"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"ba90f2186d7ad780ec640f364005fa24e797b360","version":"v0.68.3"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.20"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.20"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.20"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.2.19"},{"image":"ghcr.io/github/github-mcp-server:v0.32.0"},{"image":"node:lts-alpine"}]}
+# ___ _ _
+# / _ \ | | (_)
+# | |_| | __ _ ___ _ __ | |_ _ ___
+# | _ |/ _` |/ _ \ '_ \| __| |/ __|
+# | | | | (_| | __/ | | | |_| | (__
+# \_| |_/\__, |\___|_| |_|\__|_|\___|
+# __/ |
+# _ _ |___/
+# | | | | / _| |
+# | | | | ___ _ __ _ __| |_| | _____ ____
+# | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___|
+# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \
+# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/
+#
+# This file was automatically generated by gh-aw (v0.68.3). DO NOT EDIT.
+#
+# To update this file, edit the corresponding .md file and run:
+# gh aw compile
+# Not all edits will cause changes to this file.
+#
+# For more information: https://github.github.com/gh-aw/introduction/overview/
+#
+# Update the upcoming version's release notes when PRs merge to main.
+#
+# Secrets used:
+# - COPILOT_GITHUB_TOKEN
+# - GH_AW_CI_TRIGGER_TOKEN
+# - GH_AW_GITHUB_MCP_SERVER_TOKEN
+# - GH_AW_GITHUB_TOKEN
+# - GITHUB_TOKEN
+#
+# Custom actions used:
+# - actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+# - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+# - actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+# - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+# - github/gh-aw-actions/setup@ba90f2186d7ad780ec640f364005fa24e797b360 # v0.68.3
+#
+# Container images used:
+# - ghcr.io/github/gh-aw-firewall/agent:0.25.20
+# - ghcr.io/github/gh-aw-firewall/api-proxy:0.25.20
+# - ghcr.io/github/gh-aw-firewall/squid:0.25.20
+# - ghcr.io/github/gh-aw-mcpg:v0.2.19
+# - ghcr.io/github/github-mcp-server:v0.32.0
+# - node:lts-alpine
+
+name: "Update Upcoming Release Notes"
+"on":
+ push:
+ branches:
+ - main
+ paths-ignore:
+ - documentation/docfx/releases/*.md
+ - .github/**
+ # skip-bots: # Skip-bots processed as bot check in pre-activation job
+ # - github-actions # Skip-bots processed as bot check in pre-activation job
+ # - copilot # Skip-bots processed as bot check in pre-activation job
+ # - dependabot # Skip-bots processed as bot check in pre-activation job
+ workflow_dispatch:
+ inputs:
+ aw_context:
+ default: ""
+ description: Agent caller context (used internally by Agentic Workflows).
+ required: false
+ type: string
+
+permissions: {}
+
+concurrency:
+ cancel-in-progress: true
+ group: update-release-notes
+
+run-name: "Update Upcoming Release Notes"
+
+jobs:
+ activation:
+ needs: pre_activation
+ if: needs.pre_activation.outputs.activated == 'true'
+ runs-on: ubuntu-slim
+ permissions:
+ actions: read
+ contents: read
+ outputs:
+ comment_id: ""
+ comment_repo: ""
+ lockdown_check_failed: ${{ steps.generate_aw_info.outputs.lockdown_check_failed == 'true' }}
+ model: ${{ steps.generate_aw_info.outputs.model }}
+ secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }}
+ setup-trace-id: ${{ steps.setup.outputs.trace-id }}
+ stale_lock_file_failed: ${{ steps.check-lock-file.outputs.stale_lock_file_failed == 'true' }}
+ steps:
+ - name: Setup Scripts
+ id: setup
+ uses: github/gh-aw-actions/setup@ba90f2186d7ad780ec640f364005fa24e797b360 # v0.68.3
+ with:
+ destination: ${{ runner.temp }}/gh-aw/actions
+ job-name: ${{ github.job }}
+ trace-id: ${{ needs.pre_activation.outputs.setup-trace-id }}
+ - name: Generate agentic run info
+ id: generate_aw_info
+ env:
+ GH_AW_INFO_ENGINE_ID: "copilot"
+ GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI"
+ GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || 'auto' }}
+ GH_AW_INFO_VERSION: "1.0.21"
+ GH_AW_INFO_AGENT_VERSION: "1.0.21"
+ GH_AW_INFO_CLI_VERSION: "v0.68.3"
+ GH_AW_INFO_WORKFLOW_NAME: "Update Upcoming Release Notes"
+ GH_AW_INFO_EXPERIMENTAL: "false"
+ GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true"
+ GH_AW_INFO_STAGED: "false"
+ GH_AW_INFO_ALLOWED_DOMAINS: '["defaults"]'
+ GH_AW_INFO_FIREWALL_ENABLED: "true"
+ GH_AW_INFO_AWF_VERSION: "v0.25.20"
+ GH_AW_INFO_AWMG_VERSION: ""
+ GH_AW_INFO_FIREWALL_TYPE: "squid"
+ GH_AW_COMPILED_STRICT: "true"
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_aw_info.cjs');
+ await main(core, context);
+ - name: Validate COPILOT_GITHUB_TOKEN secret
+ id: validate-secret
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/validate_multi_secret.sh" COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default
+ env:
+ COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
+ - name: Checkout .github and .agents folders
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ persist-credentials: false
+ sparse-checkout: |
+ .github
+ .agents
+ sparse-checkout-cone-mode: true
+ fetch-depth: 1
+ - name: Check workflow lock file
+ id: check-lock-file
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_WORKFLOW_FILE: "update-release-notes.lock.yml"
+ GH_AW_CONTEXT_WORKFLOW_REF: "${{ github.workflow_ref }}"
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/check_workflow_timestamp_api.cjs');
+ await main();
+ - name: Check compile-agentic version
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_COMPILED_VERSION: "v0.68.3"
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/check_version_updates.cjs');
+ await main();
+ - name: Create prompt with built-in context
+ env:
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
+ GH_AW_SAFE_OUTPUTS: ${{ runner.temp }}/gh-aw/safeoutputs/outputs.jsonl
+ GH_AW_GITHUB_ACTOR: ${{ github.actor }}
+ GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }}
+ GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }}
+ GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }}
+ GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
+ GH_AW_GITHUB_REPOSITORY: ${{ github.repository }}
+ GH_AW_GITHUB_RUN_ID: ${{ github.run_id }}
+ GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }}
+ # poutine:ignore untrusted_checkout_exec
+ run: |
+ bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh"
+ {
+ cat << 'GH_AW_PROMPT_82e7bdc60e0d553a_EOF'
+
+ GH_AW_PROMPT_82e7bdc60e0d553a_EOF
+ cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md"
+ cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md"
+ cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md"
+ cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md"
+ cat << 'GH_AW_PROMPT_82e7bdc60e0d553a_EOF'
+
+ Tools: create_pull_request, missing_tool, missing_data, noop
+ GH_AW_PROMPT_82e7bdc60e0d553a_EOF
+ cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_create_pull_request.md"
+ cat << 'GH_AW_PROMPT_82e7bdc60e0d553a_EOF'
+
+
+ The following GitHub context information is available for this workflow:
+ {{#if __GH_AW_GITHUB_ACTOR__ }}
+ - **actor**: __GH_AW_GITHUB_ACTOR__
+ {{/if}}
+ {{#if __GH_AW_GITHUB_REPOSITORY__ }}
+ - **repository**: __GH_AW_GITHUB_REPOSITORY__
+ {{/if}}
+ {{#if __GH_AW_GITHUB_WORKSPACE__ }}
+ - **workspace**: __GH_AW_GITHUB_WORKSPACE__
+ {{/if}}
+ {{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }}
+ - **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__
+ {{/if}}
+ {{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }}
+ - **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__
+ {{/if}}
+ {{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }}
+ - **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__
+ {{/if}}
+ {{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }}
+ - **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__
+ {{/if}}
+ {{#if __GH_AW_GITHUB_RUN_ID__ }}
+ - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__
+ {{/if}}
+
+
+ GH_AW_PROMPT_82e7bdc60e0d553a_EOF
+ cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md"
+ cat << 'GH_AW_PROMPT_82e7bdc60e0d553a_EOF'
+
+ {{#runtime-import .github/workflows/update-release-notes.md}}
+ GH_AW_PROMPT_82e7bdc60e0d553a_EOF
+ } > "$GH_AW_PROMPT"
+ - name: Interpolate variables and render templates
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/interpolate_prompt.cjs');
+ await main();
+ - name: Substitute placeholders
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
+ GH_AW_GITHUB_ACTOR: ${{ github.actor }}
+ GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }}
+ GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }}
+ GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }}
+ GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
+ GH_AW_GITHUB_REPOSITORY: ${{ github.repository }}
+ GH_AW_GITHUB_RUN_ID: ${{ github.run_id }}
+ GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }}
+ GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: ${{ needs.pre_activation.outputs.activated }}
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+
+ const substitutePlaceholders = require('${{ runner.temp }}/gh-aw/actions/substitute_placeholders.cjs');
+
+ // Call the substitution function
+ return await substitutePlaceholders({
+ file: process.env.GH_AW_PROMPT,
+ substitutions: {
+ GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR,
+ GH_AW_GITHUB_EVENT_COMMENT_ID: process.env.GH_AW_GITHUB_EVENT_COMMENT_ID,
+ GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: process.env.GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER,
+ GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER,
+ GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: process.env.GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER,
+ GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY,
+ GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID,
+ GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE,
+ GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: process.env.GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED
+ }
+ });
+ - name: Validate prompt placeholders
+ env:
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
+ # poutine:ignore untrusted_checkout_exec
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/validate_prompt_placeholders.sh"
+ - name: Print prompt
+ env:
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
+ # poutine:ignore untrusted_checkout_exec
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/print_prompt_summary.sh"
+ - name: Upload activation artifact
+ if: success()
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: activation
+ path: |
+ /tmp/gh-aw/aw_info.json
+ /tmp/gh-aw/aw-prompts/prompt.txt
+ /tmp/gh-aw/github_rate_limits.jsonl
+ if-no-files-found: ignore
+ retention-days: 1
+
+ agent:
+ needs: activation
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ env:
+ DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
+ GH_AW_ASSETS_ALLOWED_EXTS: ""
+ GH_AW_ASSETS_BRANCH: ""
+ GH_AW_ASSETS_MAX_SIZE_KB: 0
+ GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs
+ GH_AW_WORKFLOW_ID_SANITIZED: updatereleasenotes
+ outputs:
+ agentic_engine_timeout: ${{ steps.detect-copilot-errors.outputs.agentic_engine_timeout || 'false' }}
+ checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }}
+ effective_tokens: ${{ steps.parse-mcp-gateway.outputs.effective_tokens }}
+ has_patch: ${{ steps.collect_output.outputs.has_patch }}
+ inference_access_error: ${{ steps.detect-copilot-errors.outputs.inference_access_error || 'false' }}
+ mcp_policy_error: ${{ steps.detect-copilot-errors.outputs.mcp_policy_error || 'false' }}
+ model: ${{ needs.activation.outputs.model }}
+ model_not_supported_error: ${{ steps.detect-copilot-errors.outputs.model_not_supported_error || 'false' }}
+ output: ${{ steps.collect_output.outputs.output }}
+ output_types: ${{ steps.collect_output.outputs.output_types }}
+ setup-trace-id: ${{ steps.setup.outputs.trace-id }}
+ steps:
+ - name: Setup Scripts
+ id: setup
+ uses: github/gh-aw-actions/setup@ba90f2186d7ad780ec640f364005fa24e797b360 # v0.68.3
+ with:
+ destination: ${{ runner.temp }}/gh-aw/actions
+ job-name: ${{ github.job }}
+ trace-id: ${{ needs.activation.outputs.setup-trace-id }}
+ - name: Set runtime paths
+ id: set-runtime-paths
+ run: |
+ {
+ echo "GH_AW_SAFE_OUTPUTS=${RUNNER_TEMP}/gh-aw/safeoutputs/outputs.jsonl"
+ echo "GH_AW_SAFE_OUTPUTS_CONFIG_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/config.json"
+ echo "GH_AW_SAFE_OUTPUTS_TOOLS_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/tools.json"
+ } >> "$GITHUB_OUTPUT"
+ - name: Checkout repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ persist-credentials: false
+ - name: Create gh-aw temp directory
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/create_gh_aw_tmp_dir.sh"
+ - name: Configure gh CLI for GitHub Enterprise
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_gh_for_ghe.sh"
+ env:
+ GH_TOKEN: ${{ github.token }}
+ - name: Configure Git credentials
+ env:
+ REPO_NAME: ${{ github.repository }}
+ SERVER_URL: ${{ github.server_url }}
+ GITHUB_TOKEN: ${{ github.token }}
+ run: |
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
+ git config --global user.name "github-actions[bot]"
+ git config --global am.keepcr true
+ # Re-authenticate git with GitHub token
+ SERVER_URL_STRIPPED="${SERVER_URL#https://}"
+ git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git"
+ echo "Git configured with standard GitHub Actions identity"
+ - name: Checkout PR branch
+ id: checkout-pr
+ if: |
+ github.event.pull_request || github.event.issue.pull_request
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ with:
+ github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/checkout_pr_branch.cjs');
+ await main();
+ - name: Install GitHub Copilot CLI
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.21
+ env:
+ GH_HOST: github.com
+ - name: Install AWF binary
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.20
+ - name: Determine automatic lockdown mode for GitHub MCP Server
+ id: determine-automatic-lockdown
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }}
+ GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }}
+ with:
+ script: |
+ const determineAutomaticLockdown = require('${{ runner.temp }}/gh-aw/actions/determine_automatic_lockdown.cjs');
+ await determineAutomaticLockdown(github, context, core);
+ - name: Download container images
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.20 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.20 ghcr.io/github/gh-aw-firewall/squid:0.25.20 ghcr.io/github/gh-aw-mcpg:v0.2.19 ghcr.io/github/github-mcp-server:v0.32.0 node:lts-alpine
+ - name: Write Safe Outputs Config
+ run: |
+ mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs"
+ mkdir -p /tmp/gh-aw/safeoutputs
+ mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs
+ cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_81a1f29413deefb8_EOF'
+ {"create_pull_request":{"draft":false,"labels":["documentation"],"max":1,"max_patch_size":1024,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS"],"protected_path_prefixes":[".github/",".agents/"],"title_prefix":"[docs] "},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{}}
+ GH_AW_SAFE_OUTPUTS_CONFIG_81a1f29413deefb8_EOF
+ - name: Write Safe Outputs Tools
+ env:
+ GH_AW_TOOLS_META_JSON: |
+ {
+ "description_suffixes": {
+ "create_pull_request": " CONSTRAINTS: Maximum 1 pull request(s) can be created. Title will be prefixed with \"[docs] \". Labels [\"documentation\"] will be automatically added."
+ },
+ "repo_params": {},
+ "dynamic_tools": []
+ }
+ GH_AW_VALIDATION_JSON: |
+ {
+ "create_pull_request": {
+ "defaultMax": 1,
+ "fields": {
+ "body": {
+ "required": true,
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 65000
+ },
+ "branch": {
+ "required": true,
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 256
+ },
+ "draft": {
+ "type": "boolean"
+ },
+ "labels": {
+ "type": "array",
+ "itemType": "string",
+ "itemSanitize": true,
+ "itemMaxLength": 128
+ },
+ "repo": {
+ "type": "string",
+ "maxLength": 256
+ },
+ "title": {
+ "required": true,
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 128
+ }
+ }
+ },
+ "missing_data": {
+ "defaultMax": 20,
+ "fields": {
+ "alternatives": {
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 256
+ },
+ "context": {
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 256
+ },
+ "data_type": {
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 128
+ },
+ "reason": {
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 256
+ }
+ }
+ },
+ "missing_tool": {
+ "defaultMax": 20,
+ "fields": {
+ "alternatives": {
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 512
+ },
+ "reason": {
+ "required": true,
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 256
+ },
+ "tool": {
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 128
+ }
+ }
+ },
+ "noop": {
+ "defaultMax": 1,
+ "fields": {
+ "message": {
+ "required": true,
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 65000
+ }
+ }
+ },
+ "report_incomplete": {
+ "defaultMax": 5,
+ "fields": {
+ "details": {
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 65000
+ },
+ "reason": {
+ "required": true,
+ "type": "string",
+ "sanitize": true,
+ "maxLength": 1024
+ }
+ }
+ }
+ }
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_safe_outputs_tools.cjs');
+ await main();
+ - name: Generate Safe Outputs MCP Server Config
+ id: safe-outputs-config
+ run: |
+ # Generate a secure random API key (360 bits of entropy, 40+ chars)
+ # Mask immediately to prevent timing vulnerabilities
+ API_KEY=$(openssl rand -base64 45 | tr -d '/+=')
+ echo "::add-mask::${API_KEY}"
+
+ PORT=3001
+
+ # Set outputs for next steps
+ {
+ echo "safe_outputs_api_key=${API_KEY}"
+ echo "safe_outputs_port=${PORT}"
+ } >> "$GITHUB_OUTPUT"
+
+ echo "Safe Outputs MCP server will run on port ${PORT}"
+
+ - name: Start Safe Outputs MCP HTTP Server
+ id: safe-outputs-start
+ env:
+ DEBUG: '*'
+ GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }}
+ GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-config.outputs.safe_outputs_port }}
+ GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-config.outputs.safe_outputs_api_key }}
+ GH_AW_SAFE_OUTPUTS_TOOLS_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/tools.json
+ GH_AW_SAFE_OUTPUTS_CONFIG_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/config.json
+ GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs
+ run: |
+ # Environment variables are set above to prevent template injection
+ export DEBUG
+ export GH_AW_SAFE_OUTPUTS
+ export GH_AW_SAFE_OUTPUTS_PORT
+ export GH_AW_SAFE_OUTPUTS_API_KEY
+ export GH_AW_SAFE_OUTPUTS_TOOLS_PATH
+ export GH_AW_SAFE_OUTPUTS_CONFIG_PATH
+ export GH_AW_MCP_LOG_DIR
+
+ bash "${RUNNER_TEMP}/gh-aw/actions/start_safe_outputs_server.sh"
+
+ - name: Start MCP Gateway
+ id: start-mcp-gateway
+ env:
+ GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }}
+ GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-start.outputs.api_key }}
+ GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-start.outputs.port }}
+ GITHUB_MCP_GUARD_MIN_INTEGRITY: ${{ steps.determine-automatic-lockdown.outputs.min_integrity }}
+ GITHUB_MCP_GUARD_REPOS: ${{ steps.determine-automatic-lockdown.outputs.repos }}
+ GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ run: |
+ set -eo pipefail
+ mkdir -p /tmp/gh-aw/mcp-config
+
+ # Export gateway environment variables for MCP config and gateway script
+ export MCP_GATEWAY_PORT="80"
+ export MCP_GATEWAY_DOMAIN="host.docker.internal"
+ MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=')
+ echo "::add-mask::${MCP_GATEWAY_API_KEY}"
+ export MCP_GATEWAY_API_KEY
+ export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads"
+ mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}"
+ export MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD="524288"
+ export DEBUG="*"
+
+ export GH_AW_ENGINE="copilot"
+ export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.2.19'
+
+ mkdir -p /home/runner/.copilot
+ cat << GH_AW_MCP_CONFIG_22b21b3be4e3afdc_EOF | bash "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.sh"
+ {
+ "mcpServers": {
+ "github": {
+ "type": "stdio",
+ "container": "ghcr.io/github/github-mcp-server:v0.32.0",
+ "env": {
+ "GITHUB_HOST": "\${GITHUB_SERVER_URL}",
+ "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}",
+ "GITHUB_READ_ONLY": "1",
+ "GITHUB_TOOLSETS": "context,repos,issues,pull_requests"
+ },
+ "guard-policies": {
+ "allow-only": {
+ "min-integrity": "$GITHUB_MCP_GUARD_MIN_INTEGRITY",
+ "repos": "$GITHUB_MCP_GUARD_REPOS"
+ }
+ }
+ },
+ "safeoutputs": {
+ "type": "http",
+ "url": "http://host.docker.internal:$GH_AW_SAFE_OUTPUTS_PORT",
+ "headers": {
+ "Authorization": "\${GH_AW_SAFE_OUTPUTS_API_KEY}"
+ },
+ "guard-policies": {
+ "write-sink": {
+ "accept": [
+ "*"
+ ]
+ }
+ }
+ }
+ },
+ "gateway": {
+ "port": $MCP_GATEWAY_PORT,
+ "domain": "${MCP_GATEWAY_DOMAIN}",
+ "apiKey": "${MCP_GATEWAY_API_KEY}",
+ "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}"
+ }
+ }
+ GH_AW_MCP_CONFIG_22b21b3be4e3afdc_EOF
+ - name: Download activation artifact
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: activation
+ path: /tmp/gh-aw
+ - name: Clean git credentials
+ continue-on-error: true
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/clean_git_credentials.sh"
+ - name: Execute GitHub Copilot CLI
+ id: agentic_execution
+ # Copilot CLI tool arguments (sorted):
+ # --allow-tool github
+ # --allow-tool safeoutputs
+ # --allow-tool shell(cat)
+ # --allow-tool shell(date)
+ # --allow-tool shell(echo)
+ # --allow-tool shell(gh:*)
+ # --allow-tool shell(git add:*)
+ # --allow-tool shell(git branch:*)
+ # --allow-tool shell(git checkout:*)
+ # --allow-tool shell(git commit:*)
+ # --allow-tool shell(git merge:*)
+ # --allow-tool shell(git rm:*)
+ # --allow-tool shell(git status)
+ # --allow-tool shell(git switch:*)
+ # --allow-tool shell(git:*)
+ # --allow-tool shell(grep)
+ # --allow-tool shell(head)
+ # --allow-tool shell(ls)
+ # --allow-tool shell(pwd)
+ # --allow-tool shell(python3)
+ # --allow-tool shell(sort)
+ # --allow-tool shell(tail)
+ # --allow-tool shell(uniq)
+ # --allow-tool shell(wc)
+ # --allow-tool shell(yq)
+ # --allow-tool write
+ timeout-minutes: 10
+ run: |
+ set -o pipefail
+ touch /tmp/gh-aw/agent-step-summary.md
+ (umask 177 && touch /tmp/gh-aw/agent-stdio.log)
+ # shellcheck disable=SC1003
+ sudo -E awf --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --image-tag 0.25.20 --skip-pull --enable-api-proxy \
+ -- /bin/bash -c 'node ${RUNNER_TEMP}/gh-aw/actions/copilot_driver.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-tool github --allow-tool safeoutputs --allow-tool '\''shell(cat)'\'' --allow-tool '\''shell(date)'\'' --allow-tool '\''shell(echo)'\'' --allow-tool '\''shell(gh:*)'\'' --allow-tool '\''shell(git add:*)'\'' --allow-tool '\''shell(git branch:*)'\'' --allow-tool '\''shell(git checkout:*)'\'' --allow-tool '\''shell(git commit:*)'\'' --allow-tool '\''shell(git merge:*)'\'' --allow-tool '\''shell(git rm:*)'\'' --allow-tool '\''shell(git status)'\'' --allow-tool '\''shell(git switch:*)'\'' --allow-tool '\''shell(git:*)'\'' --allow-tool '\''shell(grep)'\'' --allow-tool '\''shell(head)'\'' --allow-tool '\''shell(ls)'\'' --allow-tool '\''shell(pwd)'\'' --allow-tool '\''shell(python3)'\'' --allow-tool '\''shell(sort)'\'' --allow-tool '\''shell(tail)'\'' --allow-tool '\''shell(uniq)'\'' --allow-tool '\''shell(wc)'\'' --allow-tool '\''shell(yq)'\'' --allow-tool write --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
+ env:
+ COPILOT_AGENT_RUNNER_TYPE: STANDALONE
+ COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
+ COPILOT_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || '' }}
+ GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json
+ GH_AW_PHASE: agent
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
+ GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }}
+ GH_AW_VERSION: v0.68.3
+ GITHUB_API_URL: ${{ github.api_url }}
+ GITHUB_AW: true
+ GITHUB_HEAD_REF: ${{ github.head_ref }}
+ GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ GITHUB_REF_NAME: ${{ github.ref_name }}
+ GITHUB_SERVER_URL: ${{ github.server_url }}
+ GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md
+ GITHUB_WORKSPACE: ${{ github.workspace }}
+ GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com
+ GIT_AUTHOR_NAME: github-actions[bot]
+ GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com
+ GIT_COMMITTER_NAME: github-actions[bot]
+ XDG_CONFIG_HOME: /home/runner
+ - name: Detect Copilot errors
+ id: detect-copilot-errors
+ if: always()
+ continue-on-error: true
+ run: node "${RUNNER_TEMP}/gh-aw/actions/detect_copilot_errors.cjs"
+ - name: Configure Git credentials
+ env:
+ REPO_NAME: ${{ github.repository }}
+ SERVER_URL: ${{ github.server_url }}
+ GITHUB_TOKEN: ${{ github.token }}
+ run: |
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
+ git config --global user.name "github-actions[bot]"
+ git config --global am.keepcr true
+ # Re-authenticate git with GitHub token
+ SERVER_URL_STRIPPED="${SERVER_URL#https://}"
+ git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git"
+ echo "Git configured with standard GitHub Actions identity"
+ - name: Copy Copilot session state files to logs
+ if: always()
+ continue-on-error: true
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/copy_copilot_session_state.sh"
+ - name: Stop MCP Gateway
+ if: always()
+ continue-on-error: true
+ env:
+ MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }}
+ MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }}
+ GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }}
+ run: |
+ bash "${RUNNER_TEMP}/gh-aw/actions/stop_mcp_gateway.sh" "$GATEWAY_PID"
+ - name: Redact secrets in logs
+ if: always()
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/redact_secrets.cjs');
+ await main();
+ env:
+ GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN'
+ SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
+ SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }}
+ SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }}
+ SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Append agent step summary
+ if: always()
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/append_agent_step_summary.sh"
+ - name: Copy Safe Outputs
+ if: always()
+ env:
+ GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }}
+ run: |
+ mkdir -p /tmp/gh-aw
+ cp "$GH_AW_SAFE_OUTPUTS" /tmp/gh-aw/safeoutputs.jsonl 2>/dev/null || true
+ - name: Ingest agent output
+ id: collect_output
+ if: always()
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }}
+ GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com"
+ GITHUB_SERVER_URL: ${{ github.server_url }}
+ GITHUB_API_URL: ${{ github.api_url }}
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/collect_ndjson_output.cjs');
+ await main();
+ - name: Parse agent logs for step summary
+ if: always()
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_copilot_log.cjs');
+ await main();
+ - name: Parse MCP Gateway logs for step summary
+ if: always()
+ id: parse-mcp-gateway
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_mcp_gateway_log.cjs');
+ await main();
+ - name: Print firewall logs
+ if: always()
+ continue-on-error: true
+ env:
+ AWF_LOGS_DIR: /tmp/gh-aw/sandbox/firewall/logs
+ run: |
+ # Fix permissions on firewall logs so they can be uploaded as artifacts
+ # AWF runs with sudo, creating files owned by root
+ sudo chmod -R a+r /tmp/gh-aw/sandbox/firewall/logs 2>/dev/null || true
+ # Only run awf logs summary if awf command exists (it may not be installed if workflow failed before install step)
+ if command -v awf &> /dev/null; then
+ awf logs summary | tee -a "$GITHUB_STEP_SUMMARY"
+ else
+ echo 'AWF binary not installed, skipping firewall log summary'
+ fi
+ - name: Parse token usage for step summary
+ if: always()
+ continue-on-error: true
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_token_usage.cjs');
+ await main();
+ - name: Write agent output placeholder if missing
+ if: always()
+ run: |
+ if [ ! -f /tmp/gh-aw/agent_output.json ]; then
+ echo '{"items":[]}' > /tmp/gh-aw/agent_output.json
+ fi
+ - name: Upload agent artifacts
+ if: always()
+ continue-on-error: true
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: agent
+ path: |
+ /tmp/gh-aw/aw-prompts/prompt.txt
+ /tmp/gh-aw/sandbox/agent/logs/
+ /tmp/gh-aw/redacted-urls.log
+ /tmp/gh-aw/mcp-logs/
+ /tmp/gh-aw/agent_usage.json
+ /tmp/gh-aw/agent-stdio.log
+ /tmp/gh-aw/agent/
+ /tmp/gh-aw/github_rate_limits.jsonl
+ /tmp/gh-aw/safeoutputs.jsonl
+ /tmp/gh-aw/agent_output.json
+ /tmp/gh-aw/aw-*.patch
+ /tmp/gh-aw/aw-*.bundle
+ /tmp/gh-aw/sandbox/firewall/logs/
+ /tmp/gh-aw/sandbox/firewall/audit/
+ if-no-files-found: ignore
+
+ conclusion:
+ needs:
+ - activation
+ - agent
+ - detection
+ - safe_outputs
+ if: >
+ always() && (needs.agent.result != 'skipped' || needs.activation.outputs.lockdown_check_failed == 'true' ||
+ needs.activation.outputs.stale_lock_file_failed == 'true')
+ runs-on: ubuntu-slim
+ permissions:
+ contents: write
+ issues: write
+ pull-requests: write
+ concurrency:
+ group: "gh-aw-conclusion-update-release-notes"
+ cancel-in-progress: false
+ outputs:
+ incomplete_count: ${{ steps.report_incomplete.outputs.incomplete_count }}
+ noop_message: ${{ steps.noop.outputs.noop_message }}
+ tools_reported: ${{ steps.missing_tool.outputs.tools_reported }}
+ total_count: ${{ steps.missing_tool.outputs.total_count }}
+ steps:
+ - name: Setup Scripts
+ id: setup
+ uses: github/gh-aw-actions/setup@ba90f2186d7ad780ec640f364005fa24e797b360 # v0.68.3
+ with:
+ destination: ${{ runner.temp }}/gh-aw/actions
+ job-name: ${{ github.job }}
+ trace-id: ${{ needs.activation.outputs.setup-trace-id }}
+ - name: Download agent output artifact
+ id: download-agent-output
+ continue-on-error: true
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: agent
+ path: /tmp/gh-aw/
+ - name: Setup agent output environment variable
+ id: setup-agent-output-env
+ if: steps.download-agent-output.outcome == 'success'
+ run: |
+ mkdir -p /tmp/gh-aw/
+ find "/tmp/gh-aw/" -type f -print
+ echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT"
+ - name: Process no-op messages
+ id: noop
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
+ GH_AW_NOOP_MAX: "1"
+ GH_AW_WORKFLOW_NAME: "Update Upcoming Release Notes"
+ GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
+ GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }}
+ GH_AW_NOOP_REPORT_AS_ISSUE: "true"
+ with:
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_noop_message.cjs');
+ await main();
+ - name: Log detection run
+ id: detection_runs
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
+ GH_AW_WORKFLOW_NAME: "Update Upcoming Release Notes"
+ GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
+ GH_AW_DETECTION_CONCLUSION: ${{ needs.detection.outputs.detection_conclusion }}
+ GH_AW_DETECTION_REASON: ${{ needs.detection.outputs.detection_reason }}
+ with:
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_detection_runs.cjs');
+ await main();
+ - name: Record missing tool
+ id: missing_tool
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
+ GH_AW_MISSING_TOOL_CREATE_ISSUE: "true"
+ GH_AW_WORKFLOW_NAME: "Update Upcoming Release Notes"
+ with:
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/missing_tool.cjs');
+ await main();
+ - name: Record incomplete
+ id: report_incomplete
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
+ GH_AW_REPORT_INCOMPLETE_CREATE_ISSUE: "true"
+ GH_AW_WORKFLOW_NAME: "Update Upcoming Release Notes"
+ with:
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/report_incomplete_handler.cjs');
+ await main();
+ - name: Handle agent failure
+ id: handle_agent_failure
+ if: always()
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
+ GH_AW_WORKFLOW_NAME: "Update Upcoming Release Notes"
+ GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
+ GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }}
+ GH_AW_WORKFLOW_ID: "update-release-notes"
+ GH_AW_ENGINE_ID: "copilot"
+ GH_AW_SECRET_VERIFICATION_RESULT: ${{ needs.activation.outputs.secret_verification_result }}
+ GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }}
+ GH_AW_INFERENCE_ACCESS_ERROR: ${{ needs.agent.outputs.inference_access_error }}
+ GH_AW_MCP_POLICY_ERROR: ${{ needs.agent.outputs.mcp_policy_error }}
+ GH_AW_AGENTIC_ENGINE_TIMEOUT: ${{ needs.agent.outputs.agentic_engine_timeout }}
+ GH_AW_MODEL_NOT_SUPPORTED_ERROR: ${{ needs.agent.outputs.model_not_supported_error }}
+ GH_AW_CODE_PUSH_FAILURE_ERRORS: ${{ needs.safe_outputs.outputs.code_push_failure_errors }}
+ GH_AW_CODE_PUSH_FAILURE_COUNT: ${{ needs.safe_outputs.outputs.code_push_failure_count }}
+ GH_AW_LOCKDOWN_CHECK_FAILED: ${{ needs.activation.outputs.lockdown_check_failed }}
+ GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }}
+ GH_AW_GROUP_REPORTS: "false"
+ GH_AW_FAILURE_REPORT_AS_ISSUE: "true"
+ GH_AW_TIMEOUT_MINUTES: "10"
+ with:
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs');
+ await main();
+
+ detection:
+ needs:
+ - activation
+ - agent
+ if: >
+ always() && needs.agent.result != 'skipped' && (needs.agent.outputs.output_types != '' || needs.agent.outputs.has_patch == 'true')
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ outputs:
+ detection_conclusion: ${{ steps.detection_conclusion.outputs.conclusion }}
+ detection_reason: ${{ steps.detection_conclusion.outputs.reason }}
+ detection_success: ${{ steps.detection_conclusion.outputs.success }}
+ steps:
+ - name: Setup Scripts
+ id: setup
+ uses: github/gh-aw-actions/setup@ba90f2186d7ad780ec640f364005fa24e797b360 # v0.68.3
+ with:
+ destination: ${{ runner.temp }}/gh-aw/actions
+ job-name: ${{ github.job }}
+ trace-id: ${{ needs.activation.outputs.setup-trace-id }}
+ - name: Download agent output artifact
+ id: download-agent-output
+ continue-on-error: true
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: agent
+ path: /tmp/gh-aw/
+ - name: Setup agent output environment variable
+ id: setup-agent-output-env
+ if: steps.download-agent-output.outcome == 'success'
+ run: |
+ mkdir -p /tmp/gh-aw/
+ find "/tmp/gh-aw/" -type f -print
+ echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT"
+ - name: Checkout repository for patch context
+ if: needs.agent.outputs.has_patch == 'true'
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ persist-credentials: false
+ # --- Threat Detection ---
+ - name: Clean stale firewall files from agent artifact
+ run: |
+ rm -rf /tmp/gh-aw/sandbox/firewall/logs
+ rm -rf /tmp/gh-aw/sandbox/firewall/audit
+ - name: Download container images
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.20 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.20 ghcr.io/github/gh-aw-firewall/squid:0.25.20
+ - name: Check if detection needed
+ id: detection_guard
+ if: always()
+ env:
+ OUTPUT_TYPES: ${{ needs.agent.outputs.output_types }}
+ HAS_PATCH: ${{ needs.agent.outputs.has_patch }}
+ run: |
+ if [[ -n "$OUTPUT_TYPES" || "$HAS_PATCH" == "true" ]]; then
+ echo "run_detection=true" >> "$GITHUB_OUTPUT"
+ echo "Detection will run: output_types=$OUTPUT_TYPES, has_patch=$HAS_PATCH"
+ else
+ echo "run_detection=false" >> "$GITHUB_OUTPUT"
+ echo "Detection skipped: no agent outputs or patches to analyze"
+ fi
+ - name: Clear MCP configuration for detection
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
+ run: |
+ rm -f /tmp/gh-aw/mcp-config/mcp-servers.json
+ rm -f /home/runner/.copilot/mcp-config.json
+ rm -f "$GITHUB_WORKSPACE/.gemini/settings.json"
+ - name: Prepare threat detection files
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
+ run: |
+ mkdir -p /tmp/gh-aw/threat-detection/aw-prompts
+ cp /tmp/gh-aw/aw-prompts/prompt.txt /tmp/gh-aw/threat-detection/aw-prompts/prompt.txt 2>/dev/null || true
+ cp /tmp/gh-aw/agent_output.json /tmp/gh-aw/threat-detection/agent_output.json 2>/dev/null || true
+ for f in /tmp/gh-aw/aw-*.patch; do
+ [ -f "$f" ] && cp "$f" /tmp/gh-aw/threat-detection/ 2>/dev/null || true
+ done
+ for f in /tmp/gh-aw/aw-*.bundle; do
+ [ -f "$f" ] && cp "$f" /tmp/gh-aw/threat-detection/ 2>/dev/null || true
+ done
+ echo "Prepared threat detection files:"
+ ls -la /tmp/gh-aw/threat-detection/ 2>/dev/null || true
+ - name: Setup threat detection
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ WORKFLOW_NAME: "Update Upcoming Release Notes"
+ WORKFLOW_DESCRIPTION: "Update the upcoming version's release notes when PRs merge to main."
+ HAS_PATCH: ${{ needs.agent.outputs.has_patch }}
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/setup_threat_detection.cjs');
+ await main();
+ - name: Ensure threat-detection directory and log
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
+ run: |
+ mkdir -p /tmp/gh-aw/threat-detection
+ touch /tmp/gh-aw/threat-detection/detection.log
+ - name: Install GitHub Copilot CLI
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.21
+ env:
+ GH_HOST: github.com
+ - name: Install AWF binary
+ run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.20
+ - name: Execute GitHub Copilot CLI
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
+ id: detection_agentic_execution
+ # Copilot CLI tool arguments (sorted):
+ timeout-minutes: 20
+ run: |
+ set -o pipefail
+ touch /tmp/gh-aw/agent-step-summary.md
+ (umask 177 && touch /tmp/gh-aw/threat-detection/detection.log)
+ # shellcheck disable=SC1003
+ sudo -E awf --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,github.com,host.docker.internal,telemetry.enterprise.githubcopilot.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --image-tag 0.25.20 --skip-pull --enable-api-proxy \
+ -- /bin/bash -c 'node ${RUNNER_TEMP}/gh-aw/actions/copilot_driver.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --add-dir "${GITHUB_WORKSPACE}" --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"' 2>&1 | tee -a /tmp/gh-aw/threat-detection/detection.log
+ env:
+ COPILOT_AGENT_RUNNER_TYPE: STANDALONE
+ COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
+ COPILOT_MODEL: ${{ vars.GH_AW_MODEL_DETECTION_COPILOT || '' }}
+ GH_AW_PHASE: detection
+ GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
+ GH_AW_VERSION: v0.68.3
+ GITHUB_API_URL: ${{ github.api_url }}
+ GITHUB_AW: true
+ GITHUB_HEAD_REF: ${{ github.head_ref }}
+ GITHUB_REF_NAME: ${{ github.ref_name }}
+ GITHUB_SERVER_URL: ${{ github.server_url }}
+ GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md
+ GITHUB_WORKSPACE: ${{ github.workspace }}
+ GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com
+ GIT_AUTHOR_NAME: github-actions[bot]
+ GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com
+ GIT_COMMITTER_NAME: github-actions[bot]
+ XDG_CONFIG_HOME: /home/runner
+ - name: Upload threat detection log
+ if: always() && steps.detection_guard.outputs.run_detection == 'true'
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: detection
+ path: /tmp/gh-aw/threat-detection/detection.log
+ if-no-files-found: ignore
+ - name: Parse and conclude threat detection
+ id: detection_conclusion
+ if: always()
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ RUN_DETECTION: ${{ steps.detection_guard.outputs.run_detection }}
+ GH_AW_DETECTION_CONTINUE_ON_ERROR: "true"
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_threat_detection_results.cjs');
+ await main();
+
+ pre_activation:
+ runs-on: ubuntu-slim
+ outputs:
+ activated: ${{ steps.check_membership.outputs.is_team_member == 'true' && steps.check_skip_bots.outputs.skip_bots_ok == 'true' }}
+ matched_command: ''
+ setup-trace-id: ${{ steps.setup.outputs.trace-id }}
+ steps:
+ - name: Setup Scripts
+ id: setup
+ uses: github/gh-aw-actions/setup@ba90f2186d7ad780ec640f364005fa24e797b360 # v0.68.3
+ with:
+ destination: ${{ runner.temp }}/gh-aw/actions
+ job-name: ${{ github.job }}
+ - name: Check team membership for workflow
+ id: check_membership
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_REQUIRED_ROLES: "admin,maintainer,write"
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/check_membership.cjs');
+ await main();
+ - name: Check skip-bots
+ id: check_skip_bots
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_SKIP_BOTS: "github-actions,copilot,dependabot"
+ GH_AW_WORKFLOW_NAME: "Update Upcoming Release Notes"
+ with:
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/check_skip_bots.cjs');
+ await main();
+
+ safe_outputs:
+ needs:
+ - activation
+ - agent
+ - detection
+ if: (!cancelled()) && needs.agent.result != 'skipped' && needs.detection.result == 'success'
+ runs-on: ubuntu-slim
+ permissions:
+ contents: write
+ issues: write
+ pull-requests: write
+ timeout-minutes: 15
+ env:
+ GH_AW_CALLER_WORKFLOW_ID: "${{ github.repository }}/update-release-notes"
+ GH_AW_DETECTION_CONCLUSION: ${{ needs.detection.outputs.detection_conclusion }}
+ GH_AW_DETECTION_REASON: ${{ needs.detection.outputs.detection_reason }}
+ GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens }}
+ GH_AW_ENGINE_ID: "copilot"
+ GH_AW_ENGINE_MODEL: ${{ needs.agent.outputs.model }}
+ GH_AW_WORKFLOW_ID: "update-release-notes"
+ GH_AW_WORKFLOW_NAME: "Update Upcoming Release Notes"
+ outputs:
+ code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }}
+ code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }}
+ create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }}
+ create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }}
+ created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }}
+ created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }}
+ process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }}
+ process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }}
+ steps:
+ - name: Setup Scripts
+ id: setup
+ uses: github/gh-aw-actions/setup@ba90f2186d7ad780ec640f364005fa24e797b360 # v0.68.3
+ with:
+ destination: ${{ runner.temp }}/gh-aw/actions
+ job-name: ${{ github.job }}
+ trace-id: ${{ needs.activation.outputs.setup-trace-id }}
+ - name: Download agent output artifact
+ id: download-agent-output
+ continue-on-error: true
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: agent
+ path: /tmp/gh-aw/
+ - name: Setup agent output environment variable
+ id: setup-agent-output-env
+ if: steps.download-agent-output.outcome == 'success'
+ run: |
+ mkdir -p /tmp/gh-aw/
+ find "/tmp/gh-aw/" -type f -print
+ echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT"
+ - name: Download patch artifact
+ continue-on-error: true
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: agent
+ path: /tmp/gh-aw/
+ - name: Checkout repository
+ if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request')
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ ref: ${{ github.base_ref || github.event.pull_request.base.ref || github.ref_name || github.event.repository.default_branch }}
+ token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ persist-credentials: false
+ fetch-depth: 1
+ - name: Configure Git credentials
+ if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request')
+ env:
+ REPO_NAME: ${{ github.repository }}
+ SERVER_URL: ${{ github.server_url }}
+ GIT_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ run: |
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
+ git config --global user.name "github-actions[bot]"
+ git config --global am.keepcr true
+ # Re-authenticate git with GitHub token
+ SERVER_URL_STRIPPED="${SERVER_URL#https://}"
+ git remote set-url origin "https://x-access-token:${GIT_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git"
+ echo "Git configured with standard GitHub Actions identity"
+ - name: Configure GH_HOST for enterprise compatibility
+ id: ghes-host-config
+ shell: bash
+ run: |
+ # Derive GH_HOST from GITHUB_SERVER_URL so the gh CLI targets the correct
+ # GitHub instance (GHES/GHEC). On github.com this is a harmless no-op.
+ GH_HOST="${GITHUB_SERVER_URL#https://}"
+ GH_HOST="${GH_HOST#http://}"
+ echo "GH_HOST=${GH_HOST}" >> "$GITHUB_ENV"
+ - name: Process Safe Outputs
+ id: process_safe_outputs
+ uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
+ env:
+ GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }}
+ GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com"
+ GITHUB_SERVER_URL: ${{ github.server_url }}
+ GITHUB_API_URL: ${{ github.api_url }}
+ GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_pull_request\":{\"draft\":false,\"labels\":[\"documentation\"],\"max\":1,\"max_patch_size\":1024,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"AGENTS.md\"],\"protected_path_prefixes\":[\".github/\",\".agents/\"],\"title_prefix\":\"[docs] \"},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"true\"},\"report_incomplete\":{}}"
+ GH_AW_CI_TRIGGER_TOKEN: ${{ secrets.GH_AW_CI_TRIGGER_TOKEN }}
+ with:
+ github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ script: |
+ const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs');
+ setupGlobals(core, github, context, exec, io, getOctokit);
+ const { main } = require('${{ runner.temp }}/gh-aw/actions/safe_output_handler_manager.cjs');
+ await main();
+ - name: Upload Safe Outputs Items
+ if: always()
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: safe-outputs-items
+ path: |
+ /tmp/gh-aw/safe-output-items.jsonl
+ /tmp/gh-aw/temporary-id-map.json
+ if-no-files-found: ignore
+
diff --git a/.github/workflows/update-release-notes.md b/.github/workflows/update-release-notes.md
new file mode 100644
index 00000000000..6e791728e85
--- /dev/null
+++ b/.github/workflows/update-release-notes.md
@@ -0,0 +1,114 @@
+---
+description: "Update the upcoming version's release notes when PRs merge to main."
+on:
+ push:
+ branches: [main]
+ paths-ignore:
+ - "documentation/docfx/releases/*.md"
+ - ".github/**"
+ workflow_dispatch:
+ skip-bots: [github-actions, copilot, dependabot]
+concurrency:
+ group: update-release-notes
+ cancel-in-progress: true
+timeout-minutes: 10
+permissions:
+ contents: read
+tools:
+ bash: ["python3", "gh", "git", "cat", "grep"]
+ edit:
+network:
+ allowed:
+ - defaults
+safe-outputs:
+ create-pull-request:
+ title-prefix: "[docs] "
+ labels: [documentation]
+ draft: false
+---
+
+# Update Upcoming Release Notes
+
+When code merges to main, update the upcoming version's release notes page with a
+polished summary of all changes since the last release.
+
+## Step 1 — Set up
+
+Determine the upcoming version and ensure the file exists:
+
+```bash
+grep 'SKIASHARP_VERSION:' scripts/azure-templates-variables.yml
+```
+
+Extract the version number (e.g., `4.133.0`). Then ensure the version file and TOC exist:
+
+```bash
+python3 .agents/skills/release-notes/scripts/generate-release-notes.py --update-toc
+```
+
+This creates `documentation/docfx/releases/{version}.md` if missing and regenerates
+`TOC.yml` and `index.md`. Read the version file to see its current content.
+
+## Step 2 — Get raw change data
+
+Fetch the list of changes since the last release:
+
+```bash
+python3 .agents/skills/release-notes/scripts/generate-release-notes.py --unreleased --output /tmp/unreleased-raw.md
+```
+
+This uses git commit ancestry (not dates) to find all PRs on main that are not in the last
+release tag. Read `/tmp/unreleased-raw.md` to capture the raw content.
+
+## Step 3 — Read the template
+
+Read `documentation/docfx/releases/TEMPLATE.md`. This is a real example of a polished release
+notes page. Use it as the style reference — match its structure, tone, and formatting.
+
+The upcoming version adapts the template for unreleased status:
+- Use `> **Upcoming release** · In development · Not yet available on NuGet` as the header
+- Omit the Links section (no NuGet, no changelog, no API diff yet)
+- Omit Preview sections (no tagged previews yet)
+- Keep everything else: Highlights, Breaking Changes, New Features, Security, Bug Fixes,
+ Platform Support, Community Contributors
+
+## Step 4 — Write polished content
+
+Rewrite the raw PR list into polished release notes following the template:
+
+1. **Highlights** — 1-3 sentences. What's the story of this version? Lead with the biggest
+ changes. Mention community contributors by linked name.
+
+2. **Skia engine** — The version number encodes the Skia milestone (e.g., 4.**133**.0 = Skia m133).
+ Search for the merged bump PR: `gh pr list --repo mono/SkiaSharp --state merged --search "bump skia milestone {N}" --json number,title --limit 1`
+ If found, list it first under an **Engine** category. If the raw data already contains
+ a "Bump skia" PR, use that directly.
+
+3. **Categorize features** — Group by what they affect. Use sub-headers like:
+ Engine, GPU & Rendering, API Surface, Text & Fonts, Platform, Security, etc.
+ Each item: **bold title** — description. ❤️ [@contributor](https://github.com/contributor) ([#NNN](url))
+
+4. **Community contributors** — Anyone not `@mattleibow`. Mark with ❤️ inline AND list
+ in a Contributors table. **ALWAYS** link usernames: `[@user](https://github.com/user)`.
+ Never write bare `@user` anywhere.
+
+5. **Omit noise** — Skip version bumps, CI-only fixes, doc updates, workflow changes,
+ skill file edits. If many, mention as: "Plus several CI and documentation improvements."
+
+6. **Breaking changes** — If any PR has a `breaking` label or "BREAKING" in the title,
+ list under `### ⚠️ Breaking Changes` right after Highlights.
+
+7. **PR links** — Every item links to its PR: `([#NNN](url))`.
+
+If there are no user-facing changes, write: `*No user-facing changes yet.*`
+
+## Step 5 — Write the version file
+
+Use the `edit` tool to **replace the entire content** of `documentation/docfx/releases/{version}.md`
+with the polished release notes from Step 4.
+
+The file should follow the template structure exactly — title, blockquote header
+(`> **Upcoming release** · In development · Not yet available on NuGet`),
+then the polished sections (Highlights, Breaking Changes, New Features, etc.).
+
+No fence markers or placeholders needed — the workflow overwrites the whole file each run.
diff --git a/.gitignore b/.gitignore
index 2ae6554cf9d..78624883ae4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,6 +35,7 @@ source/SkiaSharp.Build.Override.targets
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
+!documentation/docfx/releases/
x64/
x86/
bld/
diff --git a/AGENTS.md b/AGENTS.md
index 7248cc23d31..79486225067 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -88,6 +88,9 @@ Single source of truth for all commands:
| **Build C#** | `dotnet build binding/SkiaSharp/SkiaSharp.csproj` |
| **Test** | `dotnet test tests/SkiaSharp.Tests.Console/SkiaSharp.Tests.Console.csproj` |
| **Regenerate** | `pwsh ./utils/generate.ps1` |
+| **Fetch release notes** | `python3 .agents/skills/release-notes/scripts/generate-release-notes.py --last 5` |
+| **Fetch unreleased PRs** | `python3 .agents/skills/release-notes/scripts/generate-release-notes.py --unreleased` |
+| **Update release notes TOC** | `python3 .agents/skills/release-notes/scripts/generate-release-notes.py --update-toc` |
### When to Use Which Bootstrap
@@ -132,6 +135,8 @@ C# Wrapper (binding/SkiaSharp/) -> P/Invoke -> C API (externals/skia/src/c/)
| `*.generated.cs` | No | Run `pwsh ./utils/generate.ps1` |
| `docs/` | No | Auto-generated |
| `documentation/dev/` | Yes | Architecture guides |
+| `documentation/docfx/releases/` | Yes | Website release notes (template-formatted) |
+| `documentation/docfx/releases/TEMPLATE.md` | Yes | Template for AI formatting |
---
@@ -336,6 +341,7 @@ Custom slash commands are available for specialized workflows. Use these for com
| Start release | `/release-branch` | "release now", "start release X" |
| Test release | `/release-testing` | "test the release", "verify packages" |
| Publish release | `/release-publish` | "push to nuget", "tag release" |
+| Release notes | `/release-notes` | "generate release notes", "regenerate 3.119.x", "write release notes for" |
| Audit release notes | `/release-notes-audit` | "compare Skia changes", "API gap analysis" |
| Update Skia | `/update-skia` | "update to milestone NNN", "bump Skia" |
| Review Skia update | `/review-skia-update` | "review the Skia merge PR" |
diff --git a/documentation/docfx/TOC.yml b/documentation/docfx/TOC.yml
index 02116e9d999..7c69992ac93 100644
--- a/documentation/docfx/TOC.yml
+++ b/documentation/docfx/TOC.yml
@@ -2,6 +2,8 @@
href: https://mono.github.io/SkiaSharp/
- name: Guides
href: guides/
+- name: Release Notes
+ href: releases/
- name: API Reference
href: https://learn.microsoft.com/dotnet/api/skiasharp
- name: Gallery
diff --git a/documentation/docfx/docfx.json b/documentation/docfx/docfx.json
index 35e4df079e6..1abce0200b2 100644
--- a/documentation/docfx/docfx.json
+++ b/documentation/docfx/docfx.json
@@ -5,6 +5,9 @@
"files": [
"**/*.md",
"**/*.yml"
+ ],
+ "exclude": [
+ "releases/TEMPLATE.md"
]
}
],
diff --git a/documentation/docfx/releases/1.49.0.md b/documentation/docfx/releases/1.49.0.md
new file mode 100644
index 00000000000..cceb3576127
--- /dev/null
+++ b/documentation/docfx/releases/1.49.0.md
@@ -0,0 +1,15 @@
+# Version 1.49.0
+
+> **Initial release of SkiaSharp** · Preview only · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.49.0-preview1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.49.0-preview1)
+
+## Highlights
+
+The first public release of SkiaSharp — a cross-platform 2D graphics API for .NET that wraps Google's Skia library (milestone 49). This preview brought Skia's powerful rendering capabilities to Xamarin and .NET developers for the first time.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Links
+
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.49.0-preview1)
diff --git a/documentation/docfx/releases/1.49.1.md b/documentation/docfx/releases/1.49.1.md
new file mode 100644
index 00000000000..b738f763a71
--- /dev/null
+++ b/documentation/docfx/releases/1.49.1.md
@@ -0,0 +1,16 @@
+# Version 1.49.1
+
+> **First stable release** · Released April 18, 2016 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.49.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.49.1)
+
+## Highlights
+
+The first stable (non-preview) release of SkiaSharp, promoting the 1.49 series to production-ready status. This release included stability improvements and fixes following the initial preview.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.49.0-preview1...v1.49.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.49.1)
diff --git a/documentation/docfx/releases/1.49.2.1.md b/documentation/docfx/releases/1.49.2.1.md
new file mode 100644
index 00000000000..68107d3f3df
--- /dev/null
+++ b/documentation/docfx/releases/1.49.2.1.md
@@ -0,0 +1,26 @@
+# Version 1.49.2.1
+
+> **Skia m49 sync and community additions** · Preview only · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.49.2.1-beta) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.49.2.1-beta)
+
+## Highlights
+
+This patch release syncs SkiaSharp with the latest changes from Google's upstream Skia milestone 49, along with community contributions from @kekekeks.
+
+## Breaking Changes
+
+*None in this release.*
+
+### Engine
+
+- **Skia m49 upstream sync** — Pulled in the latest changes from Google's Skia milestone 49 codebase.
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@kekekeks](https://github.com/kekekeks) | Additions to this release |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.49.2-beta...v1.49.2.1-beta)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.49.2.1-beta)
diff --git a/documentation/docfx/releases/1.49.2.md b/documentation/docfx/releases/1.49.2.md
new file mode 100644
index 00000000000..a5655461aa1
--- /dev/null
+++ b/documentation/docfx/releases/1.49.2.md
@@ -0,0 +1,26 @@
+# Version 1.49.2
+
+> **Community-driven improvements** · Preview only · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.49.2-beta) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.49.2-beta)
+
+## Highlights
+
+A community-driven beta release with contributions from five different contributors, bringing improvements and fixes to the SkiaSharp library.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@bholmes](https://github.com/bholmes) | Contributions to this release |
+| [@joelmartinez](https://github.com/joelmartinez) | Contributions to this release |
+| [@migueldeicaza](https://github.com/migueldeicaza) | Contributions to this release |
+| [@petergolde](https://github.com/petergolde) | Contributions to this release |
+| [@tdenniston](https://github.com/tdenniston) | Contributions to this release |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.49.1...v1.49.2-beta)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.49.2-beta)
diff --git a/documentation/docfx/releases/1.49.3.md b/documentation/docfx/releases/1.49.3.md
new file mode 100644
index 00000000000..e8bba78f649
--- /dev/null
+++ b/documentation/docfx/releases/1.49.3.md
@@ -0,0 +1,46 @@
+# Version 1.49.3
+
+> **UWP support and canvas clipping** · Preview only · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.49.3-beta) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.49.3-beta)
+
+## Highlights
+
+A feature-packed beta that brings Windows UWP support, improved canvas clipping APIs, better custom platform support, and important fixes for text encoding and canvas save/restore operations.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Platform
+
+- **Windows UWP support** — SkiaSharp can now be used in Universal Windows Platform apps.
+- **Custom platform support** — A new mechanism allows using SkiaSharp on unofficially supported platforms (such as Linux) by disabling the default native library inclusion. Set `False` in your project and manually include a native library named `libSkiaSharp`.
+
+### API Surface
+
+- **`SKCanvas` clipping** — New overloads for `ClipRect` and `ClipPath` that accept `SKRegionOperation` and antialias parameters, enabling clip region resets. Also added `GetClipBounds` and `GetClipDeviceBounds` for querying the current clip.
+
+```csharp
+void ClipRect(SKRect rect, SKRegionOperation operation = SKRegionOperation.Intersect, bool antialias = false);
+void ClipPath(SKRect rect, SKRegionOperation operation = SKRegionOperation.Intersect, bool antialias = false);
+bool GetClipBounds(ref SKRect bounds);
+bool GetClipDeviceBounds(ref SKRectI bounds);
+```
+
+## Bug Fixes
+
+- **`SKCanvas.Save` / `SKCanvas.SaveLayer` return values** — These methods now correctly return the value from native code.
+- **Text encoding handling** — `SKPaint.MeasureText`, `BreakText`, `GetTextPath`, and `GetPosTextPath` now use the encoding from `SKPaint.TextEncoding` instead of incorrectly converting to UTF-16, matching the behavior of text drawing operations.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🪟 Windows | UWP support added |
+| 🐧 Linux | Custom platform mechanism enables unofficial support |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.49.2.1-beta...v1.49.3-beta)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.49.3-beta)
diff --git a/documentation/docfx/releases/1.49.4.md b/documentation/docfx/releases/1.49.4.md
new file mode 100644
index 00000000000..271dcc01c6e
--- /dev/null
+++ b/documentation/docfx/releases/1.49.4.md
@@ -0,0 +1,47 @@
+# Version 1.49.4
+
+> **tvOS support and PDF creation** · Preview only · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.49.4-beta) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.49.4-beta)
+
+## Highlights
+
+This beta adds Apple tvOS as a supported platform and introduces PDF document creation via the new `SKDocument` API, enabling developers to generate multi-page PDF files using familiar SkiaSharp drawing methods.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Platform
+
+- **Apple tvOS support** — SkiaSharp can now be used in tvOS applications.
+
+### Images & Documents
+
+- **PDF creation** — New `SKDocument` API enables creating multi-page PDF files using standard `SKCanvas` drawing operations.
+
+```csharp
+using (var stream = new SKFileWStream("document.pdf"))
+using (var document = SKDocument.CreatePdf(stream))
+{
+ using (var canvas = document.BeginPage(width, height))
+ using (var paint = new SKPaint())
+ {
+ canvas.DrawText("...PDF...", 10f, 100f, paint);
+ document.EndPage();
+ }
+
+ document.Close();
+}
+```
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | tvOS support added |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.49.3-beta...v1.49.4-beta)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.49.4-beta)
diff --git a/documentation/docfx/releases/1.53.0.md b/documentation/docfx/releases/1.53.0.md
new file mode 100644
index 00000000000..dae275aa5e4
--- /dev/null
+++ b/documentation/docfx/releases/1.53.0.md
@@ -0,0 +1,38 @@
+# Version 1.53.0
+
+> **New codec, path effects, and expanded API surface** · Released August 1, 2016 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.53.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.53.0)
+
+## Highlights
+
+A significant feature release introducing `SKCodec` as the new image decoding API, `SKPathEffect` for path-based visual effects, and Adobe DNG image format support. The release also greatly expands `SKPath`, `SKPoint`, `SKMatrix`, `SKCanvas`, and `SKTypeface` with many new members, and corrects several memory management issues.
+
+## Breaking Changes
+
+### Image Decoding
+
+- **`SKImageDecoder` removed** — Replaced by `SKCodec`, which provides a more capable and consistent image decoding API.
+
+### Color Types
+
+- **`SKColorType.N_32` removed** — The platform-specific color type is now accessed via `SKImageInfo.PlatformColorType` instead of an enum value. This reduces confusion because the platform-specific value was not actually a separate enum entry.
+
+## New Features
+
+### API Surface
+
+- **`SKPathEffect`** — New type for applying path-based visual effects such as dashes, corners, and compositions.
+- **`SKCodec`** — New image decoding API replacing `SKImageDecoder`, with broader format support.
+- **Adobe DNG support** — SkiaSharp can now load Adobe DNG (Digital Negative) image formats.
+- **`SKPath` expansion** — Added `ArcTo`, `RArcTo`, `Rewind`, `Reset`, `AddPath`, `AddRoundedRect`, `AddCircle`, and support for iterating over path segments.
+- **`SKPoint` and `SKMatrix` expansion** — Many new members for point and matrix operations.
+- **`SKCanvas` improvements** — Added transformations using a center point and the ability to draw additional shapes.
+- **`SKTypeface` options** — New options for creating typefaces with additional configuration.
+
+## Bug Fixes
+
+- Corrected many memory management issues.
+
+## Links
+
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.53.0)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.53.0)
diff --git a/documentation/docfx/releases/1.53.1.1.md b/documentation/docfx/releases/1.53.1.1.md
new file mode 100644
index 00000000000..901c404920a
--- /dev/null
+++ b/documentation/docfx/releases/1.53.1.1.md
@@ -0,0 +1,21 @@
+# Version 1.53.1.1
+
+> **Paint stroke fix** · Released August 17, 2016 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.53.1.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.53.1.1)
+
+## Highlights
+
+A hotfix release that resolves an issue where setting `SKPaint.IsStroke` had no effect on rendering output.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- **`SKPaint.IsStroke` had no effect** — Setting the stroke property on a paint object now correctly applies stroke rendering. ([#135](https://github.com/mono/SkiaSharp/issues/135))
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.53.1...v1.53.1.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.53.1.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.53.1.1)
diff --git a/documentation/docfx/releases/1.53.1.2.md b/documentation/docfx/releases/1.53.1.2.md
new file mode 100644
index 00000000000..a2bbd095ea9
--- /dev/null
+++ b/documentation/docfx/releases/1.53.1.2.md
@@ -0,0 +1,36 @@
+# Version 1.53.1.2
+
+> **Canvas from bitmap and Windows Store certification fix** · Released August 24, 2016 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.53.1.2) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.53.1.2)
+
+## Highlights
+
+Adds the ability to create an `SKCanvas` directly from an `SKBitmap`, expands `SKPaint` and `SKPath` with additional members, and fixes Windows Store App certification compliance.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### API Surface
+
+- **`SKCanvas` from `SKBitmap`** — A canvas can now be created directly from a bitmap for in-memory drawing operations.
+- **Additional `SKPaint` members** — New members added to `SKPaint` for more control over painting behavior.
+- **Additional `SKPath` members** — New members added to `SKPath` for expanded path construction.
+
+## Bug Fixes
+
+- **Windows Store App certification failure** — Resolved an issue that caused SkiaSharp to violate Windows Store App certification requirements. ([#129](https://github.com/mono/SkiaSharp/issues/129))
+- **C/C# interop fixes** — Several fixes to the C/C# interop layer for improved stability.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🪟 Windows | Fixed Windows Store App certification compliance |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.53.1.1...v1.53.1.2)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.53.1.2)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.53.1.2)
diff --git a/documentation/docfx/releases/1.53.1.md b/documentation/docfx/releases/1.53.1.md
new file mode 100644
index 00000000000..29d04132002
--- /dev/null
+++ b/documentation/docfx/releases/1.53.1.md
@@ -0,0 +1,34 @@
+# Version 1.53.1
+
+> **Strong naming and color table support** · Released August 16, 2016 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.53.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.53.1)
+
+## Highlights
+
+This release introduces strong name signing for SkiaSharp.dll and adds `SKColorTable` support to `SKBitmap` and `SKCodec` for indexed-color image workflows. Also includes bug fixes, expanded documentation, and a new WPF sample.
+
+## Breaking Changes
+
+### Assembly Signing
+
+- **SkiaSharp.dll is now a strong name assembly** — This may require binding redirects or recompilation for projects that reference SkiaSharp without strong naming.
+
+## New Features
+
+### API Surface
+
+- **`SKColorTable`** — New type for working with indexed color tables.
+- **`SKBitmap` color table support** — `SKBitmap` now supports `SKColorTable` for indexed-color bitmaps.
+- **`SKCodec` color table support** — `SKCodec` now supports `SKColorTable` for decoding indexed-color images.
+
+### Samples
+
+- **WPF sample** — Added a new sample demonstrating SkiaSharp usage in WPF applications.
+
+## Bug Fixes
+
+- Fixed several issues. [Closed issues](https://github.com/mono/SkiaSharp/issues?utf8=%E2%9C%93&q=is%3Aissue%20closed%3A2016-07-28..2016-08-16) from this period.
+
+## Links
+
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.53.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.53.1)
diff --git a/documentation/docfx/releases/1.53.2.md b/documentation/docfx/releases/1.53.2.md
new file mode 100644
index 00000000000..e679e32ae41
--- /dev/null
+++ b/documentation/docfx/releases/1.53.2.md
@@ -0,0 +1,69 @@
+# Version 1.53.2
+
+> **GPU rendering and SVG canvas support (pre-release)** · Preview only · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.53.2-gpu2) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.53.2-svg1)
+
+## Highlights
+
+A pre-release introducing two major capabilities: hardware-accelerated GPU rendering via OpenGL and SVG output via `SKSvgCanvas`. This release includes all changes from v1.53.1.2 and adds the ability to assemble a `GRGlInterface` from any GL library. Both GPU and SVG features were in beta and subject to API changes.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### GPU & Rendering
+
+- **OpenGL support** — Hardware-accelerated rendering via OpenGL on all platforms except UWP (which was planned for DirectX/ANGLE support). ([#138](https://github.com/mono/SkiaSharp/issues/138))
+- **`GRGlInterface.AssembleGlInterface` / `AssembleGlesInterface`** — Assemble a GL interface from any GL library by providing a function pointer lookup callback:
+
+ ```csharp
+ var openGLES = ObjCRuntime.Dlfcn.dlopen(
+ "/System/Library/Frameworks/OpenGLES.framework/OpenGLES", 0);
+ var glInterface = GRGlInterface.AssembleGlesInterface((ctx, name) => {
+ return ObjCRuntime.Dlfcn.dlsym(openGLES, name);
+ });
+ ```
+
+### SVG
+
+- **`SKSvgCanvas`** — Create a canvas that writes SVG output to an XML stream. Partial SVG feature coverage — not all Skia drawing operations are supported in SVG output. ([#107](https://github.com/mono/SkiaSharp/issues/107))
+
+ ```csharp
+ using (var writer = new SKXmlStreamWriter(skStream))
+ using (var canvas = SKSvgCanvas.Create(bounds, writer))
+ {
+ // draw as normal — canvas is just an SKCanvas
+ }
+ ```
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.53.1.2...v1.53.2)
+- [NuGet (GPU Beta 2)](https://www.nuget.org/packages/SkiaSharp/1.53.2-gpu2)
+- [NuGet (SVG Beta 1)](https://www.nuget.org/packages/SkiaSharp/1.53.2-svg1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.53.2)
+
+---
+
+## GPU Beta 2 (August 24, 2016)
+
+Added `GRGlInterface.AssembleGlInterface` and `AssembleGlesInterface` for assembling a GL interface from any GL library.
+
+[NuGet](https://www.nuget.org/packages/SkiaSharp/1.53.2-gpu2)
+
+---
+
+## SVG Beta 1 (August 25, 2016)
+
+Added `SKSvgCanvas` for creating a canvas that writes SVG output to an XML stream.
+
+[NuGet](https://www.nuget.org/packages/SkiaSharp/1.53.2-svg1)
+
+---
+
+## GPU Beta 1 (August 19, 2016)
+
+Initial OpenGL support across all platforms (except UWP).
+
+[NuGet](https://www.nuget.org/packages/SkiaSharp/1.53.2-gpu1)
diff --git a/documentation/docfx/releases/1.54.0.md b/documentation/docfx/releases/1.54.0.md
new file mode 100644
index 00000000000..ec60b77970f
--- /dev/null
+++ b/documentation/docfx/releases/1.54.0.md
@@ -0,0 +1,40 @@
+# Version 1.54.0
+
+> **GPU backend and Skia m54 update** · Released September 5, 2016 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.54.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.54.0)
+
+## Highlights
+
+This release updates to Google's chrome/m54 Skia milestone and introduces GPU-accelerated rendering via `SKSurface` with OpenGL support across all platforms (except UWP, which will use ANGLE). It also adds new struct members, a gamma color filter, image lattice (9-patch) drawing, and additional `SKPath` members.
+
+## Breaking Changes
+
+### Struct API changes
+
+- **Structs now use properties instead of fields** — `SKRect`, `SKPoint`, `SKColor`, and other basic structs have moved from field-based access to get/set properties for better API consistency.
+
+## New Features
+
+### Engine
+
+- **Skia m54 update** — Updated to the latest from Google's [chrome/m54](https://github.com/google/skia/tree/chrome/m54) release.
+
+### GPU & Rendering
+
+- **GPU backend for `SKSurface`** — Hardware-accelerated rendering via OpenGL on all platforms. On UWP, DirectX support via ANGLE is planned. A `GlInterface` can also be assembled from any OpenGL-like API using `AssembleGlInterface` or `AssembleGlesInterface`.
+
+### API Surface
+
+- **New struct members** — Multiple new members for `SKRect`, `SKPoint`, `SKColor`, and other basic structs.
+- **Gamma `SKColorFilter`** — New color filter type for gamma correction.
+- **Image lattice drawing** — Support for drawing image lattices, such as 9-patch images.
+- **Additional `SKPath` members** — New methods and properties for path manipulation.
+
+## Bug Fixes
+
+*None noted in this release.*
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.53.2...v1.54.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.54.0)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.54.0)
diff --git a/documentation/docfx/releases/1.54.1.md b/documentation/docfx/releases/1.54.1.md
new file mode 100644
index 00000000000..1316fc38300
--- /dev/null
+++ b/documentation/docfx/releases/1.54.1.md
@@ -0,0 +1,42 @@
+# Version 1.54.1
+
+> **SkiaSharp.Views launch and native binary size reduction** · Released October 12, 2016 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.54.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.54.1)
+
+## Highlights
+
+This release introduces the new **SkiaSharp.Views** and **SkiaSharp.Views.Forms** packages (preview), providing pre-built UI views for every supported platform with both CPU and GPU backends. Native binary sizes on Windows/UWP were reduced from over 15 MB to under 5 MB per architecture. `SKMatrix` moves to a property-based API and `GRGlInterface` gains ANGLE support.
+
+## Breaking Changes
+
+### SKMatrix
+
+- **`SKMatrix` is now property-based** — `SKMatrix` fields have been replaced with get/set properties for consistency with other struct types.
+
+## New Features
+
+### API Surface
+
+- **`SKMatrix` flat array support** — `SKMatrix` can now be read from and written to as a flat array.
+- **`GRGlInterface` ANGLE support** — Added support for creating an ANGLE interface and improved GL interface assembly.
+
+### Platform
+
+- **SkiaSharp.Views** _(preview)_ — A new package of pre-built UI views, panels, and surfaces for drawing on every supported platform (iOS, tvOS, Android, macOS, WPF, Classic Desktop, UWP) with both CPU and GPU (OpenGL/ANGLE) backends.
+- **SkiaSharp.Views.Forms** _(preview)_ — Xamarin.Forms views for fully cross-platform drawing code with CPU and GPU backends, currently available for iOS, Android, and UWP.
+- **Class library native file handling** — Class library projects that depend on SkiaSharp no longer copy native files, allowing `Any CPU` builds. Apps still get the native files automatically. Use `True` to opt back in.
+
+### Build & Size
+
+- **Massive Windows/UWP native binary size reduction** — Reduced from >15 MB to <5 MB per platform architecture. ❤️ @xoofx
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@xoofx](https://github.com/xoofx) | Identified the native binary size issue on Windows/UWP |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.54.0...v1.54.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.54.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.54.1)
diff --git a/documentation/docfx/releases/1.55.0.md b/documentation/docfx/releases/1.55.0.md
new file mode 100644
index 00000000000..c28b1510de1
--- /dev/null
+++ b/documentation/docfx/releases/1.55.0.md
@@ -0,0 +1,56 @@
+# Version 1.55.0
+
+> **Skia m55, SVG preview, and comprehensive documentation** · Released November 10, 2016 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.55.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.55.0)
+
+## Highlights
+
+A major feature release that updates to Google's chrome/m55 Skia milestone, introduces the new **SkiaSharp.Svg** package for lightweight SVG parsing, and ships thousands of API documentation entries across the entire SkiaSharp surface. New APIs include `SKColor.Parse`, `SKPathMeasure`, `SKRegion`-based clipping, and `SKPaint.GetFillPath`. SkiaSharp.Views gains `CanvasSize` for pixel density calculations.
+
+## Breaking Changes
+
+### Upstream Skia changes
+
+- **`GRContext.Flush(GRContextFlushBits)` obsoleted** — Use the parameterless `GRContext.Flush()` instead.
+- **`SKDocument.Close()` return type changed** — No longer returns `bool`; now returns `void`.
+- **`SKPaint.XferMode` obsoleted** — Use `SKPaint.BlendMode` instead.
+
+## New Features
+
+### Engine
+
+- **Skia m55 update** — Updated to Google's chrome/m55 release with all upstream improvements.
+
+### API Surface
+
+- **HTML color parsing** — `SKColor.Parse` and `SKColor.TryParse` for parsing HTML hex color strings.
+- **Region-based clipping** — Added `SKRegion` clipping options for `SKCanvas`.
+- **`SKPaint.GetFillPath()`** — Creates a new path representing the fill outline using the paint's fill properties.
+- **`SKPathMeasure`** — New type for measuring path length and extracting path segments.
+- **`SKPath` additions** — Numerous new overloads and members for path manipulation.
+- **`SKTypeface` property getters** — Added getters for `SKTypeface` properties.
+- **Struct expansions** — Additional members and overloads for `SKRect*`, `SKSize*`, `SKPoint*`, and `SKMatrix`.
+- **Improved image lattice drawing** — Better support for 9-patch style image rendering.
+- **Improved argument validation** — Better exceptions for invalid or incorrect arguments.
+
+### Platform
+
+- **SkiaSharp.Svg** _(preview)_ — A new lightweight, pure-managed SVG parser (`SKSvg`) supporting features on par with NGraphics. Lives in a [single file](https://github.com/mono/SkiaSharp/blob/v1.55.0/source/SkiaSharp.Svg/SkiaSharp.Svg/SKSvg.cs). ❤️ @gentledepp also contributed a more full-featured [SVG library](https://github.com/gentledepp/SVG/tree/skiasharp) with SkiaSharp support.
+- **`CanvasSize` property** — Views now expose `CanvasSize` for calculating scaling and pixel density: `var scaling = view.CanvasSize.Width / view.Width;`
+- **Views namespace update** — Namespace changed to `SkiaSharp.Views.`.
+- **Improved UWP internals** — Better `GRGlInterface` internals for UWP.
+
+### Documentation
+
+- **Comprehensive API documentation** — Added thousands of XML docs across the entire SkiaSharp API.
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@gentledepp](https://github.com/gentledepp) | Added SkiaSharp support to the SVG library |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.54.1...v1.55.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.55.0)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.55.0)
diff --git a/documentation/docfx/releases/1.55.1.md b/documentation/docfx/releases/1.55.1.md
new file mode 100644
index 00000000000..487023d3b8f
--- /dev/null
+++ b/documentation/docfx/releases/1.55.1.md
@@ -0,0 +1,50 @@
+# Version 1.55.1
+
+> **Bitmap, codec, and platform fixes** · Released November 21, 2016 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.55.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.55.1)
+
+## Highlights
+
+A patch release with improvements to `SKBitmap` (format-specific decoding, pixel replacement, better `Index8` support), incremental decoding for `SKCodec`, `QuickReject` for `SKCanvas`, and a fix for the Windows Mobile emulator and Xbox One. Views now support ignoring device scaling, and SVG gains custom canvas sizing.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### API Surface
+
+- **`SKBitmap` decoding improvements** — Bitmaps can now be decoded as a specific format (size/scale, color type) and pixels can be replaced in a variety of ways.
+- **`SKBitmap` `Index8` color type support** — Better support for the `Index8` color type. ❤️ @Tylerflick
+- **`SKCanvas.QuickReject`** — Perform a fast bounds check before drawing to avoid unnecessary work.
+- **`SKCodec` incremental decoding** — Codecs now support incremental decoding for progressive image loading.
+- **`GRBackendRenderTargetDesc` convenience members** — Added `Size` and `Rect` properties for easier use.
+- **`SKColorTable` indexer** — Access colors directly via an indexer.
+- **`SKData` as stream** — `SKData` can now be used as a stream, which manages the lifetime of the underlying data.
+
+### Platform
+
+- **Views ignore device scaling option** — All raster-based views (SkiaSharp.Views and SkiaSharp.Views.Forms) now have an option to ignore device scaling.
+- **SVG custom canvas sizing** — SVG files can be loaded onto a canvas of a pre-defined size, ignoring the drawing size in the SVG file or handling files without a size set.
+
+## Bug Fixes
+
+- Fixed SkiaSharp for Windows Mobile emulator and Xbox One.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🪟 Windows | Fixed Windows Mobile emulator and Xbox One support |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@Tylerflick](https://github.com/Tylerflick) | Improved `Index8` color type support in `SKBitmap` |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.55.0...v1.55.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.55.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.55.1)
diff --git a/documentation/docfx/releases/1.56.0.md b/documentation/docfx/releases/1.56.0.md
new file mode 100644
index 00000000000..6023ca59c16
--- /dev/null
+++ b/documentation/docfx/releases/1.56.0.md
@@ -0,0 +1,53 @@
+# Version 1.56.0
+
+> **GIF support, bitmap resize, and OpenTK removal** · Released January 16, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.56.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.56.0)
+
+## Highlights
+
+This release adds multi-frame image support (animated GIFs) via `SKCodec`, bitmap resizing with `SKBitmap.Resize`, direct pixel manipulation with `InstallPixels` and `PeekPixels`, and new `SKPixmap` bindings. The GL views drop their OpenTK dependency across all Apple and Android platforms, and the UWP `SKXamlCanvas` gets a non-blocking `Invalidate()`.
+
+## Breaking Changes
+
+### Deprecations
+
+- **`SKXfermode` deprecated** — `SKXfermode` has been deprecated in favour of `SKBlendMode`.
+- **`SKPicture.Bounds` renamed** — `SKPicture.Bounds` is now `SKPicture.CullRect` for correctness.
+
+## New Features
+
+### Images
+
+- **Bitmap resizing** — New `SKBitmap.Resize` for resizing bitmaps.
+- **Direct pixel manipulation** — `SKBitmap.InstallPixels` and `SKBitmap.PeekPixels` for updating pixels directly.
+- **`SKPixmap` bindings** — New bindings for the `SKPixmap` type.
+- **Multi-frame image support** — `SKCodec` now supports multi-frame images such as animated GIFs.
+- **Encoding information** — `SKCodec` can now read the encoding information of a bitmap file.
+
+### Platform
+
+- **Removed OpenTK dependency** — GL views on Android, iOS, tvOS, and macOS no longer depend on OpenTK.
+- **iOS transparent views** — `SKCanvasView` and `SKGLViewRenderer` in Xamarin.Forms on iOS are now transparent by default.
+- **UWP non-blocking invalidation** — `SKXamlCanvas` for UWP no longer blocks on `Invalidate()`.
+
+### GPU & Rendering
+
+- **SVG transparency and opacity** — Correctly handling SVG transparency and opacity in the SkiaSharp.Svg parser.
+
+## Bug Fixes
+
+- Fixed Android GL views to correctly clear the stencil buffer.
+- Added a stencil buffer for macOS GL views.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | Removed OpenTK dependency; macOS gains stencil buffer for GL views; iOS views default to transparent |
+| 🪟 Windows | UWP `SKXamlCanvas` no longer blocks on `Invalidate()` |
+| 🤖 Android | Removed OpenTK dependency; fixed GL stencil buffer clearing |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.55.1...v1.56.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.56.0)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.56.0)
diff --git a/documentation/docfx/releases/1.56.1.md b/documentation/docfx/releases/1.56.1.md
new file mode 100644
index 00000000000..21acf955cf0
--- /dev/null
+++ b/documentation/docfx/releases/1.56.1.md
@@ -0,0 +1,67 @@
+# Version 1.56.1
+
+> **.NET Standard, .NET Core, and major API expansion** · Released February 8, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.56.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.56.1)
+
+## Highlights
+
+A landmark release that adds .NET Standard 1.3 and .NET Core support, bringing SkiaSharp to modern .NET platforms. Four new types arrive — `SKFontManager`, `SKSvgCanvas`, `SKMask`, and `SK3dView` — along with extensive additions to `SKPath`, `SKBitmap`, and `SKCodec`. Unicode, UTF-32, and emoji support is significantly improved. The Xamarin.Forms view renderers are now public and extensible, and the SVG viewbox handling is fixed.
+
+## Breaking Changes
+
+### Renames
+
+- **`SKStrokeJoin.Mitter` → `SKStrokeJoin.Miter`** — Corrected the typo in the enum value name. ([#227](https://github.com/mono/SkiaSharp/issues/227))
+
+## New Features
+
+### API Surface
+
+- **`SKFontManager`** — Find typefaces for a specific character, enabling better font fallback. ([#232](https://github.com/mono/SkiaSharp/issues/232))
+- **`SKSvgCanvas`** _(preview)_ — Create SVG files programmatically via a canvas API. ([#107](https://github.com/mono/SkiaSharp/issues/107))
+- **`SKMask`** — New type for working with mask data, plus `SKBitmap` can now be created from an `SKMask`. ([#220](https://github.com/mono/SkiaSharp/issues/220))
+- **`SK3dView`** — Create 3D `SKMatrix` transformations. ([#214](https://github.com/mono/SkiaSharp/issues/214))
+- **`SKPath` expansions** — Many new members including `AddPoly` and `SegmentMasks`.
+- **`SKBitmap` expansions** — Many new members including `ExtractAlpha` and `ExtractSubset`.
+- **Unicode and emoji support** — Improved support for Unicode, UTF-32, and emoji rendering. ([#232](https://github.com/mono/SkiaSharp/issues/232))
+- **`StringUtilities`** — New string helper methods for text processing.
+- **High quality `SKMaskFilter` blurring** — Support for high quality blurring effects.
+- **`SKCodec` scanline decoding** — Codecs now support scanline-by-scanline decoding.
+- **PDF metadata and annotations** — `SKDocument` now supports PDF metadata and link annotations.
+- **`SKImageInfo.PlatformColorType` fix** — Now correctly obtains the platform color type.
+
+### Platform
+
+- **.NET Standard 1.3 support** — SkiaSharp now targets .NET Standard 1.3 project types. ([#111](https://github.com/mono/SkiaSharp/issues/111))
+- **.NET Core support** — Native libraries for Windows (win7, win10) and macOS. ([#111](https://github.com/mono/SkiaSharp/issues/111))
+- **Reduced native library sizes** — Native binaries reduced to ~5 MB per platform architecture. ([#174](https://github.com/mono/SkiaSharp/issues/174))
+- **Class library native copy fix** — .NET 4.5 class library builds (including tests) now correctly copy the native assembly to output. ([#44](https://github.com/mono/SkiaSharp/issues/44), [#190](https://github.com/mono/SkiaSharp/issues/190))
+- **Public Xamarin.Forms renderers** — `SKCanvasViewRenderer` and `SKGLViewRenderer` are now public and can be extended by apps and libraries. ([#218](https://github.com/mono/SkiaSharp/issues/218))
+- **SVG viewbox fix** — Fixed handling of the SVG viewbox in SkiaSharp.Svg. ([#230](https://github.com/mono/SkiaSharp/issues/230))
+
+## Bug Fixes
+
+- Fixed `SKImageInfo.PlatformColorType` to correctly return the platform-specific color type.
+- Fixed SVG viewbox handling. ([#230](https://github.com/mono/SkiaSharp/issues/230))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 📦 General | .NET Standard 1.3 and .NET Core support; ~5 MB native libraries |
+| 🪟 Windows | .NET Core support (win7, win10) |
+| 🍎 Apple | .NET Core support (macOS) |
+| 🐧 Linux | Partial .NET Core Linux work in progress |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.56.0...v1.56.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.56.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.56.1)
+
+---
+
+## Beta (February 2, 2017)
+
+Initial beta with .NET Standard 1.3 and .NET Core support, new types (`SKSvgCanvas`, `SKMask`, `SK3dView`), reduced native library sizes, and various API additions.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.56.0...v1.56.1-beta)
diff --git a/documentation/docfx/releases/1.56.2.md b/documentation/docfx/releases/1.56.2.md
new file mode 100644
index 00000000000..b80d207e378
--- /dev/null
+++ b/documentation/docfx/releases/1.56.2.md
@@ -0,0 +1,57 @@
+# Version 1.56.2
+
+> **3D transforms, image API expansion, and cross-platform image conversion** · Released March 9, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.56.2) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.56.2)
+
+## Highlights
+
+This release adds `SKMatrix44` for 3D transformations, `SKFrontBufferedStream` for decoding non-seekable streams, `SKPMColor` for premultiplied color handling, and extensive new members on `SKImage` and `SKCanvas`. SkiaSharp.Views gains comprehensive image conversion extensions between SkiaSharp types and native platform image types (UIImage, Bitmap, WriteableBitmap, CGImage, NSImage), and UWP `SKXamlCanvas` gets major performance improvements. Many types that previously only accepted `SKStream` now have .NET `Stream` overloads.
+
+## Breaking Changes
+
+### Color handling
+
+- **`SKColorTable` now uses premultiplied colors** — `SKColorTable` correctly uses `SKPMColor` (premultiplied) instead of `SKColor`. Passing `SKColor` values will be premultiplied automatically. This may affect code that was relying on the previous (incorrect) behavior.
+
+## New Features
+
+### API Surface
+
+- **`SKMatrix44`** — New type for representing 3D matrix transformations.
+- **`SKFrontBufferedStream`** — Wraps non-seekable streams for use with `SKCodec` and `SKBitmap` decoding.
+- **`SKPMColor`** — New type for premultiplied colors, with methods for premultiplying and unpremultiplying `SKColor` values.
+- **`SKImage` expansion** — Many new members for constructing pixel-backed and texture-backed images, plus `ReadPixels`, `PeekPixels`, `ScalePixels`, and `ApplyImageFilter`.
+- **`SKData` creation overloads** — Several new overloads for creating `SKData` instances either as a copy or a wrapper.
+- **`GRContext.ResetContext`** — Reset the internal GPU context state.
+- **`SKCanvas.DrawVertices`** — Draw vertex-based geometry.
+- **`.NET `Stream` overloads** — Many types that accepted `SKStream` now also accept .NET `Stream` types.
+- **Nested enum refactoring** — Moved more nested enumerations out to the root namespace.
+
+### Platform
+
+- **Cross-platform image conversion extensions** — New extension methods in SkiaSharp.Views for converting between SkiaSharp types (`SKBitmap`, `SKImage`, `SKPixmap`, `SKPicture`) and native image types (UWP/WPF `WriteableBitmap`, Android/Desktop `Bitmap`, iOS/tvOS `UIImage`, Apple `CGImage`/`CIImage`, macOS `NSImage`).
+- **`SKData`/`NSData` conversion** — New extension methods for converting between `SKData` and Apple `NSData`.
+- **SkiaSharp `ImageSource` types** — New Xamarin.Forms `ImageSource` types for directly drawing SkiaSharp images.
+- **UWP `SKXamlCanvas` performance** — Major performance improvements to the UWP canvas.
+- **NuGet native library handling** — Installing SkiaSharp into unit test projects or class libraries now correctly copies native libraries to the bin directory.
+
+### SVG
+
+- **Improved viewbox handling** — Continued improvements to SVG viewbox handling in SkiaSharp.Svg.
+
+## Bug Fixes
+
+- Fixed a bug where Skia returned the same native instance but SkiaSharp created a new wrapper, causing premature disposal of the shared instance.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | Image conversion extensions for `UIImage`, `CGImage`, `CIImage`, `NSImage`; `SKData`↔`NSData` conversion |
+| 🪟 Windows | Image conversion for `WriteableBitmap`; major UWP `SKXamlCanvas` performance improvements |
+| 🤖 Android | Image conversion extensions for `Bitmap` |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.56.1...v1.56.2)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.56.2)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.56.2)
diff --git a/documentation/docfx/releases/1.57.0.md b/documentation/docfx/releases/1.57.0.md
new file mode 100644
index 00000000000..05907611362
--- /dev/null
+++ b/documentation/docfx/releases/1.57.0.md
@@ -0,0 +1,61 @@
+# Version 1.57.0
+
+> **Skia m57 upgrade with new encoding APIs** · Released April 10, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.57.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.57.0)
+
+## Highlights
+
+A major release upgrading the native Skia engine from m56 to m57. This brings direct encoding support on `SKBitmap`, `SKPixmap`, and `SKSurface`, XPS document creation on Windows, and deprecates `SK3dView` in favor of `SKMatrix44`. Several breaking changes align the API with upstream Skia removals.
+
+## Breaking Changes
+
+### Removed APIs
+
+- **Emboss and shadow `SKMaskFilter` removed** — These filter types are no longer available in upstream Skia m57.
+- **`SKEncodedFormat` and `SKImageEncodeFormat` renamed** — Use `SKEncodedImageFormat` instead.
+- **`[Obsolete]` members are now errors** — Previously obsolete members now produce compile-time errors. Update to the recommended replacements.
+
+### Deprecations
+
+- **`SK3dView` is now obsolete** — Use `SKMatrix44` instead for 3D transformations.
+
+## New Features
+
+### Engine
+
+- **Skia m57 upgrade** — Major update to the latest stable Skia milestone (chrome/m57).
+
+### API Surface
+
+- **`SKBitmap.Encode`** — Bitmaps can now be encoded directly without creating an intermediate image.
+- **`SKCanvas` draws `SKSurface` directly** — Draw a surface onto a canvas without extracting an image first.
+- **`SKData` empty creation** — `SKData` can now be created without existing data (uninitialized).
+- **`SKPixmap.Encode` overloads** — Encode pixel data directly from a pixmap.
+- **`SKSurface` pixel data access** — New members to access pixel data directly from a surface.
+
+### Documents
+
+- **XPS document support** — `SKDocument` can now create XPS documents (Windows-only). Note: there is a [known issue on Windows 10 Mobile](http://stackoverflow.com/questions/43143501/using-ixpsomobjectfactory-on-windows-10-mobile).
+
+### Extensions (Preview)
+
+- **`SKGeometry` utilities** — Initial work on geometry helpers including `CreateSectorPath` for pie/donut shapes, `CreatePiePath` for charts, and methods to create regular shape paths.
+
+## Bug Fixes
+
+- Resolved AOT errors on Android.
+- `SKCanvasView` and `SKGLView` now correctly resize in Xamarin.Forms in some cases.
+- Many other bug fixes and improvements.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🪟 Windows | XPS document creation via `SKDocument` |
+| 🤖 Android | AOT error fixes |
+| 🎨 Core | Skia m57 engine upgrade, new encoding APIs |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.56.2...v1.57.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.57.0)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.57.0)
diff --git a/documentation/docfx/releases/1.57.1.md b/documentation/docfx/releases/1.57.1.md
new file mode 100644
index 00000000000..abdfc4afb4b
--- /dev/null
+++ b/documentation/docfx/releases/1.57.1.md
@@ -0,0 +1,53 @@
+# Version 1.57.1
+
+> **HarfBuzz text shaping & Xamarin.Mac support** · Released May 5, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.57.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.57.1)
+
+## Highlights
+
+This release introduces HarfBuzzSharp — initial bindings for the HarfBuzz text shaping engine — along with `SKShaper` and `DrawShapedText` for easy shaped text rendering. Xamarin.Forms gains preview Xamarin.Mac support and reworked renderers, while several text rendering and packaging bugs are fixed.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Text
+
+- **HarfBuzzSharp initial bindings** — New preview package exposing HarfBuzz text shaping with bindings for `Blob`, `Buffer`, `Face`, and `Font`.
+- **`SKShaper` for text shaping** — New type that shapes a string and returns codepoints with their positions.
+- **`DrawShapedText` extension method** — Extension method on `SKCanvas` for drawing shaped text easily.
+- **`ToHarfBuzzBlob` extension** — Extension method on `SKStreamAsset` to convert seekable streams to HarfBuzz blobs.
+
+### API Surface
+
+- **`SKTypeface` font data stream** — `SKTypeface` now supports opening a stream to the underlying font data.
+
+### Platform
+
+- **Xamarin.Mac support (preview)** — Initial Xamarin.Mac support in SkiaSharp.Views.Forms.
+- **Reworked Xamarin.Forms renderers** — Renderers have been reworked making extension and customization far easier.
+- **Designer detection improvements** — SkiaSharp.Views now detects the designer correctly when native assets aren't available.
+
+## Bug Fixes
+
+- Fixed non-antialiased text on a scaled canvas on Windows.
+- Fixed an issue with publishing a .NET Core app to Windows 10.
+- The Xamarin.Forms Previewer no longer crashes when adding SkiaSharp views.
+- Fixed renderers adding multiple native views when in a list view item.
+- NuGet now requires NuGet v3.5+ for UWP apps.
+- Improvements for Xamarin Workbooks and macOS packaging.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🪟 Windows | Text rendering fix on scaled canvas; .NET Core publishing fix |
+| 🍎 Apple | Preview Xamarin.Mac support; macOS packaging improvements |
+| 🎨 Core | HarfBuzz text shaping; `SKTypeface` font data stream |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.57.0...v1.57.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.57.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.57.1)
diff --git a/documentation/docfx/releases/1.58.0.md b/documentation/docfx/releases/1.58.0.md
new file mode 100644
index 00000000000..d4b83d38502
--- /dev/null
+++ b/documentation/docfx/releases/1.58.0.md
@@ -0,0 +1,48 @@
+# Version 1.58.0
+
+> **Skia m58 upgrade with color space support** · Released May 19, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.58.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.58.0)
+
+## Highlights
+
+This release upgrades the native Skia engine from m57 to m58, bringing new `SKColorSpace` bindings and a high-contrast color filter. Images are now always decoded as premultiplied alpha. A few color filter APIs have been removed to match upstream Skia changes, and Linux support has been improved.
+
+## Breaking Changes
+
+### Removed APIs
+
+- **`SKColorFilter.CreateColorCube` removed** — No longer available in upstream Skia m58.
+- **`SKColorFilter.CreateGamma` removed** — No longer available in upstream Skia m58.
+
+### Behavior Changes
+
+- **Images decoded as premultiplied alpha** — Images are now always decoded as premultiplied alpha, matching upstream Skia behavior.
+
+## New Features
+
+### Engine
+
+- **Skia m58 upgrade** — Update to the latest stable Skia milestone (chrome/m58).
+
+### API Surface
+
+- **`SKColorSpace` bindings** — New bindings for working with color spaces.
+- **`SKColorFilter.CreateHighContrast`** — New high-contrast color filter for accessibility and visual enhancement scenarios.
+- **Additional `SKImageFilter` and `SKPathEffect` types** — A few more filter and path effect types are now available.
+
+## Bug Fixes
+
+- General bug fixes and improvements.
+- Improvements for Linux consumers.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🐧 Linux | Improved support for Linux consumers |
+| 🎨 Core | Skia m58 engine upgrade, `SKColorSpace`, high-contrast filter |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.57.1...v1.58.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.58.0)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.58.0)
diff --git a/documentation/docfx/releases/1.58.1.1.md b/documentation/docfx/releases/1.58.1.1.md
new file mode 100644
index 00000000000..a57a5b4b1b3
--- /dev/null
+++ b/documentation/docfx/releases/1.58.1.1.md
@@ -0,0 +1,21 @@
+# Version 1.58.1.1
+
+> **ObjectDisposedException hotfix** · Released September 12, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp.Views/1.58.1.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.58.1.1)
+
+## Highlights
+
+A targeted hotfix release for [v1.58.1](https://github.com/mono/SkiaSharp/releases/tag/v1.58.1) that resolves an `ObjectDisposedException` in SkiaSharp.Views. Only the SkiaSharp.Views package is updated in this release.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- Fixed `ObjectDisposedException` in SkiaSharp.Views. ([#292](https://github.com/mono/SkiaSharp/issues/292))
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.58.1...v1.58.1.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp.Views/1.58.1.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.58.1.1)
diff --git a/documentation/docfx/releases/1.58.1.md b/documentation/docfx/releases/1.58.1.md
new file mode 100644
index 00000000000..83d571ce651
--- /dev/null
+++ b/documentation/docfx/releases/1.58.1.md
@@ -0,0 +1,49 @@
+# Version 1.58.1
+
+> **Touch events & bug fixes** · Released June 30, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.58.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.58.1)
+
+## Highlights
+
+This release adds touch event support to all Xamarin.Forms views and .NET Standard 1.3 support. Several bugs are fixed including color rendering issues on some devices, an incorrect `GRContextOptions` struct, and `SKRegion.SetPath` always producing empty regions. SkiaSharp.Svg and SkiaSharp.Extended have moved to their own repository.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Platform
+
+- **Touch events for Xamarin.Forms views** — All Xamarin.Forms views now support touch events via `EnableTouchEvents` and the `Touch` event. Disabled by default due to an iOS Xamarin.Forms bug ([PR 990](https://github.com/xamarin/Xamarin.Forms/pull/990), [bug 57114](https://bugzilla.xamarin.com/show_bug.cgi?id=57114)).
+- **.NET Standard 1.3 support** — SkiaSharp.Views.Forms now targets .NET Standard 1.3.
+- **tvOS minimum lowered to 9.0** — tvOS now targets 9.0 instead of 10.2.
+
+### API Surface
+
+- **`SKRectI.Ceiling` and `SKRectI.Floor` overloads** — New overloads to inflate/deflate to integral coordinates. ([#318](https://github.com/mono/SkiaSharp/issues/318))
+
+### Repository
+
+- **SkiaSharp.Svg & SkiaSharp.Extended moved** — These packages have moved to [mono/SkiaSharp.Extended](https://github.com/mono/SkiaSharp.Extended) and will be updated independently.
+
+## Bug Fixes
+
+- Corrected the `GRContextOptions` struct definition.
+- Fixed color rendering issues on some devices. ([#284](https://github.com/mono/SkiaSharp/issues/284))
+- Fixed `SKRegion.SetPath` always creating an empty region. ([#316](https://github.com/mono/SkiaSharp/issues/316))
+- Fixed GC-related issues with Android views. ([#292](https://github.com/mono/SkiaSharp/issues/292))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | tvOS minimum lowered to 9.0; touch events in Xamarin.Forms |
+| 🤖 Android | GC-related view fix; touch events in Xamarin.Forms |
+| 🪟 Windows | Touch events in Xamarin.Forms |
+| 🎨 Core | `GRContextOptions` fix, `SKRegion.SetPath` fix, `SKRectI` overloads |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.58.0...v1.58.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.58.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.58.1)
diff --git a/documentation/docfx/releases/1.59.0.md b/documentation/docfx/releases/1.59.0.md
new file mode 100644
index 00000000000..8093dd29ec9
--- /dev/null
+++ b/documentation/docfx/releases/1.59.0.md
@@ -0,0 +1,32 @@
+# Version 1.59.0
+
+> **Skia engine update to Chrome m59** · Released July 15, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.59.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.59.0)
+
+## Highlights
+
+This release brings a major Skia engine update to the `chrome/m59` branch, including updates to internal structure types to match the new native layout. SkiaSharp.Views received bug fixes, and SkiaSharp.Svg and SkiaSharp.Extended were moved to their own repository for independent release cadences.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Engine
+
+- **Skia updated to chrome/m59** — Major engine update with structural type changes to match the new native Skia layout.
+
+### Ecosystem
+
+- **SkiaSharp.Svg & SkiaSharp.Extended split out** — These packages moved to [mono/SkiaSharp.Extended](https://github.com/mono/SkiaSharp.Extended) for independent versioning and release cycles.
+- **HarfBuzzSharp text shaping (preview)** — HarfBuzzSharp 1.4.6 and SkiaSharp.HarfBuzz provide text shaping via the `SKShaper` type, with `DrawShapedText` extension methods on `SKCanvas`.
+
+## Bug Fixes
+
+- Fixed issues in SkiaSharp.Views. ([#333](https://github.com/mono/SkiaSharp/issues/333), [#340](https://github.com/mono/SkiaSharp/issues/340))
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.58.1...v1.59.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.59.0)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.59.0)
diff --git a/documentation/docfx/releases/1.59.1.1.md b/documentation/docfx/releases/1.59.1.1.md
new file mode 100644
index 00000000000..e7657bbcd5f
--- /dev/null
+++ b/documentation/docfx/releases/1.59.1.1.md
@@ -0,0 +1,21 @@
+# Version 1.59.1.1
+
+> **Views disposal bugfix** · Released September 12, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp.Views/1.59.1.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.59.1.1)
+
+## Highlights
+
+A targeted bugfix release for SkiaSharp.Views that resolves an `ObjectDisposedException` that could occur during view rendering.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- Resolved `ObjectDisposedException` in SkiaSharp.Views. ([#292](https://github.com/mono/SkiaSharp/issues/292))
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.59.1...v1.59.1.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp.Views/1.59.1.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.59.1.1)
diff --git a/documentation/docfx/releases/1.59.1.md b/documentation/docfx/releases/1.59.1.md
new file mode 100644
index 00000000000..221bade4ed1
--- /dev/null
+++ b/documentation/docfx/releases/1.59.1.md
@@ -0,0 +1,22 @@
+# Version 1.59.1
+
+> **Native marshalling fixes** · Released July 18, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.59.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.59.1)
+
+## Highlights
+
+A quick follow-up to 1.59.0 with fixes and improvements to the native marshalling layer. SkiaSharp.Views also received a reworked internal logic to use the updated structure members from the m59 engine update.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- Fixes and improvements to the native marshalling layer introduced in 1.59.0.
+- Reworked SkiaSharp.Views logic to use the new structure members. ([#333](https://github.com/mono/SkiaSharp/issues/333))
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.59.0...v1.59.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.59.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.59.1)
diff --git a/documentation/docfx/releases/1.59.2.md b/documentation/docfx/releases/1.59.2.md
new file mode 100644
index 00000000000..26f2052bc09
--- /dev/null
+++ b/documentation/docfx/releases/1.59.2.md
@@ -0,0 +1,35 @@
+# Version 1.59.2
+
+> **Unity3D support, stream fixes, and GRContext access** · Released October 26, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.59.2) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.59.2)
+
+## Highlights
+
+This release adds Unity3D compatibility, allows `SKTypeface` to be constructed from non-seekable streams or `SKData`, and exposes the `GRContext` on GL views. Several memory management and stream handling fixes improve reliability, particularly for loading bitmaps over the network. The project also migrated from `packages.config` to ``.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### API Surface
+
+- **`SKTypeface` from non-seekable streams** — `SKTypeface` can now be constructed from non-seekable streams or `SKData`, improving flexibility when loading fonts from network or resource sources.
+- **`GRContext` exposed on GL views** — The current `GRContext` is now accessible on the GL views in both SkiaSharp.Views and SkiaSharp.Views.Forms. ([#358](https://github.com/mono/SkiaSharp/issues/358))
+
+### Platform
+
+- **Unity3D compatibility** — The managed SkiaSharp.dll now works with Unity3D.
+- **PackageReference migration** — Switched from `packages.config` to `` for cleaner project files.
+
+## Bug Fixes
+
+- Resolved `ObjectDisposedException` during view rendering. ([#292](https://github.com/mono/SkiaSharp/issues/292))
+- Corrected `SKManagedStream` behavior, fixing bitmap loading over the network. ([#335](https://github.com/mono/SkiaSharp/issues/335))
+- Memory management fixes for `SKManagedStream`. ([#376](https://github.com/mono/SkiaSharp/issues/376), [#83](https://github.com/mono/SkiaSharp/issues/83))
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.59.1...v1.59.2)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.59.2)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.59.2)
diff --git a/documentation/docfx/releases/1.59.3.md b/documentation/docfx/releases/1.59.3.md
new file mode 100644
index 00000000000..3411cafc962
--- /dev/null
+++ b/documentation/docfx/releases/1.59.3.md
@@ -0,0 +1,23 @@
+# Version 1.59.3
+
+> **SK3dView restored** · Released December 19, 2017 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.59.3) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.59.3)
+
+## Highlights
+
+This release restores the `SK3dView` type, which has been confirmed as a stable part of the Skia API. It was previously removed as its status was uncertain.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### API Surface
+
+- **`SK3dView` re-added** — `SK3dView` has been added back to the API surface after confirmation that it is a stable part of Skia.
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.59.2...v1.59.3)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.59.3)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.59.3)
diff --git a/documentation/docfx/releases/1.60.0.md b/documentation/docfx/releases/1.60.0.md
new file mode 100644
index 00000000000..028cca9f8aa
--- /dev/null
+++ b/documentation/docfx/releases/1.60.0.md
@@ -0,0 +1,91 @@
+# Version 1.60.0
+
+> **Skia m60 upgrade with new platform support** · Released February 23, 2018 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.60.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.60.0)
+
+## Highlights
+
+SkiaSharp 1.60.0 upgrades to Skia milestone 60, bringing major improvements to GPU-backed rendering and texture-based surfaces. This release also introduces preview support for Apple watchOS and GTK#, and cleans up the API surface by removing previously obsoleted types and members.
+
+## Breaking Changes
+
+- Removed many obsolete types and members that were previously marked with `[Obsolete]`. Code referencing these removed APIs will need to migrate to their recommended replacements.
+- Removed confusing and incorrect `SKCanvas` overloads that could produce unexpected results.
+
+## New Features
+
+### Engine
+
+- **Skia m60 upgrade** — Updated the underlying Skia engine to milestone 60.
+
+### GPU & Rendering
+
+- **Texture-based surface improvements** — Major improvements to texture-backed surface support and older device compatibility.
+- **GPU-backed SKImage** — Improved support for creating and working with texture-backed `SKImage` instances.
+
+### Streams
+
+- **SKAbstractManagedStream** — Custom `SKStream` implementations can now be created using `SKAbstractManagedStream`.
+- **SKFrontBufferedManagedStream** — New stream type that enables reading from read-only, forward-only streams.
+- **Unicode path support** — Streams can now open files with Unicode paths on Windows.
+- **SKStream.Peek()** — Added the missing `Peek()` method to `SKStream`.
+
+### Images
+
+- **Color swizzling** — Added support for swizzling color channel order (RGB ↔ BGR).
+- **SKPixelSerializer / SKManagedPixelSerializer** — New types for custom image encoding workflows.
+- **SKBitmap improvements** — Improved bitmap copying, auto-locking, and decoding from Unicode paths on Windows.
+
+### Canvas
+
+- **New overloads** — Added numerous `SKCanvas` overloads to improve usability.
+- **9-patch and lattice drawing** — Improved support for 9-patch and image lattice rendering.
+- **SKPaint.BreakText fix** — Now properly returns the number of characters and the split text.
+
+### Documents
+
+- **XPS close fix** — XPS documents are now correctly closed.
+- **Unicode path support** — Documents can now be created with Unicode paths on Windows.
+
+### Platform — Views
+
+- **SKGLTextureView** — New Android view for GPU-accelerated texture-based rendering.
+- **SKWidget** — New GTK# widget for SkiaSharp rendering *(preview)*.
+- **WPF DPI fix** — WPF now creates the backing bitmap with the correct DPI.
+- **SKControl constructors** — Additional constructors to control the underlying OpenGL configuration.
+
+### Platform — Xamarin.Forms
+
+- **Xamarin.Forms v2.5** — Updated to Xamarin.Forms v2.5.
+- **UWP touch events** — Improved touch event handling on UWP.
+- **SKGLView on Android** — Switched the backing view to the new texture-based `SKGLTextureView`.
+
+### Text Shaping *(preview)*
+
+- **HarfBuzzSharp 1.4.6** — HarfBuzz text shaping engine bindings.
+- **SkiaSharp.HarfBuzz 1.60.0** — Adds `SKShaper` for text shaping and `DrawShapedText` extension methods on `SKCanvas`.
+
+## Bug Fixes
+
+- Fixed `SKPaint.BreakText` to properly return character count and split text.
+- Fixed XPS documents not being correctly closed.
+- Fixed WPF backing bitmap using incorrect DPI.
+- Improved memory management across several types.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 watchOS | New preview support for Apple watchOS |
+| 🤖 Android | New `SKGLTextureView`; `SKGLView` now uses texture-based rendering |
+| 🐧 Linux / GTK# | New `SKWidget` for GTK# *(preview)* |
+| 🪟 Windows / WPF | DPI fix for backing bitmap; improved UWP touch events |
+| 🪟 Windows | Unicode path support for streams, images, and documents |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.59.3...v1.60.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.60.0)
+- [SkiaSharp.Views](https://www.nuget.org/packages/SkiaSharp.Views/1.60.0)
+- [SkiaSharp.Views.Forms](https://www.nuget.org/packages/SkiaSharp.Views.Forms/1.60.0)
+- [HarfBuzzSharp](https://www.nuget.org/packages/HarfBuzzSharp/1.4.6)
+- [SkiaSharp.HarfBuzz](https://www.nuget.org/packages/SkiaSharp.HarfBuzz/1.60.0)
diff --git a/documentation/docfx/releases/1.60.1.md b/documentation/docfx/releases/1.60.1.md
new file mode 100644
index 00000000000..7d40dbbac6e
--- /dev/null
+++ b/documentation/docfx/releases/1.60.1.md
@@ -0,0 +1,59 @@
+# Version 1.60.1
+
+> **Tizen support and build system overhaul** · Released May 22, 2018 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.60.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.60.1)
+
+## Highlights
+
+This release introduces preview support for Tizen OS across SkiaSharp, Views, and Xamarin.Forms. It also includes a major build system overhaul that moves almost all native code into the mono/skia repository and eliminates the managed tooling requirement for Windows and Linux native builds.
+
+## Breaking Changes
+
+- **Dropped PCL support** — Portable Class Library targets have been removed. All packages now use .NET Standard 1.3.
+
+## New Features
+
+### Tizen OS (Preview)
+
+- **SkiaSharp for Tizen** — Added Tizen OS support for the core SkiaSharp library.
+- **SKCanvasView for Tizen** — Added `SKCanvasView` for CPU-backed drawing on Tizen.
+- **SKGLSurfaceView for Tizen** — Added `SKGLSurfaceView` for GPU-backed drawing on Tizen.
+- **Xamarin.Forms for Tizen** — Added Tizen platform support in SkiaSharp.Views.Forms.
+
+### API Additions
+
+- **SKAutoCoInitialize** — New helper type to assist in initializing COM on supported platforms.
+- **GRGlInterface.CreateNativeEvasInterface()** — Creates a GL interface from an Evas GL object for Tizen GPU rendering.
+- **ISKCanvasViewController** — Now public, allowing additional platforms to be added more easily.
+
+### Build System
+
+- **Build system overhaul** — Major restructuring of the build pipeline.
+- **Simplified native builds** — Building libSkiaSharp for Windows and Linux no longer requires any managed tooling.
+- **Native code consolidation** — Almost all native code has been moved into the [mono/skia](https://github.com/mono/skia) repository.
+
+## Bug Fixes
+
+- Fixed a bug when copying bitmaps.
+- Fixed a bug when opening `SKDocument`.
+- Fixed a bug when disposing objects.
+- Fixed a bug in Android's `GLTextureView` where the stack trace was lost.
+- Fixed a bug in Android's `GLTextureView` where pausing the app would cause a crash.
+- Fixed a bug in iOS where color space information was lost.
+- Fixed a bug in GTK#'s `SKWidget` where it would try to swizzle too many pixels.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 📱 Tizen | New preview support for SkiaSharp, Views, and Forms |
+| 🤖 Android | Fixed `GLTextureView` stack trace loss and pause crash |
+| 🍎 iOS | Fixed color space information loss |
+| 🐧 Linux | Native build no longer requires managed tooling |
+| 🪟 Windows | Native build no longer requires managed tooling |
+| 🖥️ GTK# | Fixed pixel swizzle bug in `SKWidget` |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.60.0...v1.60.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.60.1)
+- [Milestone](https://github.com/mono/SkiaSharp/milestone/26)
diff --git a/documentation/docfx/releases/1.60.2.md b/documentation/docfx/releases/1.60.2.md
new file mode 100644
index 00000000000..20e0e088352
--- /dev/null
+++ b/documentation/docfx/releases/1.60.2.md
@@ -0,0 +1,36 @@
+# Version 1.60.2
+
+> **New drawing primitives and platform fixes** · Released June 28, 2018 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.60.2) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.60.2)
+
+## Highlights
+
+This release introduces `SKNWayCanvas` for drawing to multiple canvases simultaneously and `SKRoundRect` for more complex rounded rectangle support. It also adds flexible encoding overloads to `SKPixmap` and resolves several platform-specific linking and rendering issues.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Drawing
+
+- **SKNWayCanvas** — Draw to multiple canvases simultaneously, enabling broadcast-style rendering to several targets at once.
+- **SKRoundRect** — Draw more complex rounded rectangles with per-corner radius control.
+
+### Encoding
+
+- **SKPixmap.Encode() overloads** — Additional `Encode()` overloads on `SKPixmap` for finer control when encoding to PNG, JPEG, and WEBP formats.
+
+## Bug Fixes
+
+- Fixed UWP library being linked to wrong libraries ([#566](https://github.com/mono/SkiaSharp/issues/566), [#536](https://github.com/mono/SkiaSharp/issues/536))
+- Fixed iOS not being able to AOT compile ([#547](https://github.com/mono/SkiaSharp/issues/547))
+- Fixed slow rendering in GTK# `SKWidget` ([#534](https://github.com/mono/SkiaSharp/issues/534))
+- Fixed memory leak in `SKXamlCanvas` on UWP and Xamarin.Forms ([#429](https://github.com/mono/SkiaSharp/issues/429))
+- Upgraded projects to new SDK-style format; removed shared projects and enabled Android builds on Windows
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.60.1...v1.60.2)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.60.2)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.60.2)
diff --git a/documentation/docfx/releases/1.60.3.md b/documentation/docfx/releases/1.60.3.md
new file mode 100644
index 00000000000..c44be15575f
--- /dev/null
+++ b/documentation/docfx/releases/1.60.3.md
@@ -0,0 +1,24 @@
+# Version 1.60.3
+
+> **Bug fix patch** · Released August 13, 2018 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.60.3) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.60.3)
+
+## Highlights
+
+A small patch release fixing native asset stripping, UWP canvas rendering, and touch input handling on Android and Tizen.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- Fixed case where some native assets were not being stripped properly ([#573](https://github.com/mono/SkiaSharp/issues/573), [#584](https://github.com/mono/SkiaSharp/issues/584))
+- Improvements when building Tizen apps ([#598](https://github.com/mono/SkiaSharp/issues/598))
+- **Views:** Fixed issue with UWP `SKXamlCanvas` ([#582](https://github.com/mono/SkiaSharp/issues/582), [#585](https://github.com/mono/SkiaSharp/issues/585))
+- **Forms:** Fixed issue with touch locations on Android and Tizen ([#581](https://github.com/mono/SkiaSharp/issues/581), [#589](https://github.com/mono/SkiaSharp/issues/589))
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.60.2...v1.60.3)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.60.3)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/1.60.3)
diff --git a/documentation/docfx/releases/1.68.0.md b/documentation/docfx/releases/1.68.0.md
new file mode 100644
index 00000000000..3d4c1464a13
--- /dev/null
+++ b/documentation/docfx/releases/1.68.0.md
@@ -0,0 +1,88 @@
+# Version 1.68.0
+
+> **Major Skia engine upgrade** · Released December 4, 2018 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.68.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.68.0)
+
+## Highlights
+
+This release upgrades SkiaSharp to **Skia milestone 68**, bringing a completely rewritten GPU surface creation pipeline, significant text API improvements, and major file I/O performance gains. The GPU backend changes modernize hardware-accelerated rendering across all platforms, while new `SKTextBlob` support lays the groundwork for advanced text layout. Linux users gain first-class NuGet packaging, and Windows Classic apps no longer require a separate Visual C++ Runtime install.
+
+## Breaking Changes
+
+### GPU Surface Creation
+
+- **`GRBackendRenderTargetDesc` deprecated** — Replaced by `GRBackendRenderTarget`. The new type provides a cleaner, more explicit API for describing render targets. See the [GPU migration guide](changelogs/SkiaSharp/1.68.0/gpu-migration.md) for details.
+- **`GRBackendTextureDesc` deprecated** — Replaced by `GRBackendTexture`. Update all GPU texture creation code to use the new type.
+- **`SKPaintGLSurfaceEventArgs` updated** — Event args now surface the new GPU types. Existing handlers should migrate to the new properties.
+
+### Color & Pixel Formats
+
+- **8-bit indexed color type (`Index8`) removed** — Skia m68 dropped support for indexed color. Convert indexed images to a full-color type (`Rgba8888`, `Bgra8888`, etc.) before use.
+- **`SKColorTable` removed** — Color tables are no longer supported. Any code referencing `SKColorTable` must be updated to use direct pixel formats.
+
+### Surface Properties
+
+- **`SKSurfaceProps` struct superseded** — Use the new `SKSurfaceProperties` class instead. The class provides the same functionality with a richer API.
+
+### Views & Event Handling
+
+- **macOS/iOS/tvOS delegates deprecated** — Use events or override `OnPaintSurface` instead.
+- **Android renderer usage deprecated** — Use events or override `OnPaintSurface` instead.
+
+## New Features
+
+### Engine
+
+- **Skia m68 upgrade** — Brings all upstream Skia improvements, optimizations, and bug fixes from milestone 68.
+- **Major file I/O performance improvements** — Decoding, encoding, and processing operations are significantly faster.
+
+### GPU & Rendering
+
+- **Rewritten hardware-accelerated surface creation** — The entire GPU pipeline has been modernized with `GRBackendRenderTarget` and `GRBackendTexture`, providing better device compatibility and clearer semantics. See the [GPU migration guide](changelogs/SkiaSharp/1.68.0/gpu-migration.md).
+- **UWP GPU view rewritten** — The hardware-accelerated view now supports more devices and includes multiple bug fixes.
+- **Pixel scaling** — `SKPixmap`, `SKImage`, and `SKBitmap` all support `ScalePixels` for high-quality image resizing.
+
+### Text
+
+- **`SKTextBlob` and `SKTextBlobBuilder`** — First-class text blob support, enabling efficient batched text rendering and laying the foundation for advanced text layout.
+- **Expanded `SKPaint` text API** — New methods: `BreakText`, `GetGlyphs`, `CountGlyphs`, `ContainsGlyphs`, `GetGlyphWidths`, `GetTextIntercepts`, `GetPositionedTextIntercepts`, `GetHorizontalTextIntercepts`.
+- **Expanded `SKTypeface` text API** — New methods: `GetGlyphs`, `CountGlyphs`.
+
+### Fonts
+
+- **`SKFontManager` enhancements** — Load entire font family sets via `SKFontStyleSet` and match characters more precisely.
+
+### Images & Documents
+
+- **Easier `SKImage` creation** — New overloads simplify image decoding and creation from various sources.
+- **`SKDocumentPdfMetadata`** — New creation options for PDF document metadata (title, author, subject, etc.).
+
+### Platform
+
+- **Linux NuGet package** — New `SkiaSharp.NativeAssets.Linux` package ships pre-built Ubuntu 16.04 amd64 binaries, with support for most Debian-based distributions. ([#312](https://github.com/mono/SkiaSharp/issues/312))
+- **Static VC++ Runtime on Windows** — The Visual C++ Runtime is now statically linked on Windows Classic, eliminating the need for a separate runtime installer.
+- **Android `SKGLView` transparency** — The Xamarin.Forms `SKGLView` on Android is now a transparent view.
+
+### API Surface
+
+- **New method overloads** — Additional convenience overloads for surfaces, shaders, and effects across the API.
+- **Preferred `OnPaintSurface` pattern** — All views now prefer `OnPaintSurface` as the primary override point for drawing.
+
+## Bug Fixes
+
+- Multiple bug fixes across the core library and platform views.
+- UWP hardware-accelerated view stability and device compatibility improvements.
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.60.3...v1.68.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.68.0)
+- [Project Board](https://github.com/mono/SkiaSharp/projects/18)
+- [Milestone](https://github.com/mono/SkiaSharp/milestone/30)
+
+---
+
+## Preview 28 (November 14, 2018)
+
+Release candidate build containing all features and fixes that shipped in the stable 1.68.0 release.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.60.3...v1.68.0-preview28)
diff --git a/documentation/docfx/releases/1.68.1.1.md b/documentation/docfx/releases/1.68.1.1.md
new file mode 100644
index 00000000000..44b9fce8fcd
--- /dev/null
+++ b/documentation/docfx/releases/1.68.1.1.md
@@ -0,0 +1,50 @@
+# Version 1.68.1.1
+
+> **Windows Nano Server support and security fixes** · Released December 19, 2019 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.68.1.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.68.1.1)
+
+## Highlights
+
+This release brings first-class Windows Nano Server support for .NET Core containers, fixes critical memory buffer overflow bugs in image decoding, and includes community-driven improvements to memory management and matrix operations.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Platform Support
+
+- **Windows Nano Server** — Added the `SkiaSharp.NativeAssets.NanoServer` package, enabling SkiaSharp to run in standard Windows .NET Core Docker images. ([#676](https://github.com/mono/SkiaSharp/issues/676))
+
+## Bug Fixes
+
+- Fixed memory buffer overflow bugs when decoding some image files
+- Fixed memory leak with allocations ❤️ [@daltonks](https://github.com/daltonks)
+- Improvements to image decoding with `SKImage`
+- Fixed .NET Standard assemblies being referenced instead of platform-specific assemblies in SkiaSharp.Views.Forms
+- Fixed string marshaling issue in HarfBuzzSharp
+
+## Improvements
+
+- Matrix improvements ❤️ [@bender2k14](https://github.com/bender2k14)
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@daltonks](https://github.com/daltonks) | Memory leak fix |
+| [@bender2k14](https://github.com/bender2k14) | Matrix improvements |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.1...v1.68.1.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.68.1.1)
+- [Milestone](https://github.com/mono/SkiaSharp/milestone/32)
+
+---
+
+## Preview Build 9 (December 10, 2019)
+
+Initial preview of 1.68.1.1 with Nano Server support and memory-related fixes.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/releases/tag/v1.68.1.1)
diff --git a/documentation/docfx/releases/1.68.1.md b/documentation/docfx/releases/1.68.1.md
new file mode 100644
index 00000000000..926def303a4
--- /dev/null
+++ b/documentation/docfx/releases/1.68.1.md
@@ -0,0 +1,92 @@
+# Version 1.68.1
+
+> **Memory reliability and .NET Core 3.0 support** · Released November 22, 2019 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.68.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.68.1)
+
+## Highlights
+
+This release focuses on memory reliability, fixing several issues with managed-native interop and
+static instance lifetimes. It also brings performance improvements via Clang on Win32, new
+`Span` overloads across SkiaSharp and HarfBuzzSharp, and a significant expansion of the
+HarfBuzz binding surface.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Memory & Interop
+
+- **Managed-native delegate interop overhaul** — Removed intermediate dictionary for delegate
+ interop, improving performance and reliability.
+- **Clang on Win32** — Switched native builds to Clang for improved performance on Windows.
+
+### New APIs
+
+- **`SKDrawable` bindings** — Full bindings for the Skia drawable type. ❤️ @charlenni ([#940](https://github.com/mono/SkiaSharp/pull/940))
+- **`SKColorSpace` APIs** — Added colorspace creation and management APIs.
+- **`SKRunBuffer` / `SKHorizontalRunBuffer` / `SKPositionedRunBuffer`** — New run buffer types for `SKTextBlob` and `SKTextBlobBuilder`.
+- **`SKShader` from `SKPicture`** — Create shaders directly from recorded pictures. ❤️ @alexandrvslv
+- **Additional `SKRegion` members** — Expanded region operations. ❤️ @vexx32x
+- **Additional `SKPaint` and `SKMatrix` members** — More paint and matrix helpers. ❤️ @MarchingCube
+- **`Span` overloads** — Added `Span` alternatives alongside existing `byte[]` and `IntPtr` overloads.
+
+### Packages & Platform Support
+
+- **`SkiaSharp.NativeAssets.Linux.NoDependencies`** — New NuGet package for Linux environments without `libfontconfig`.
+- **View packages split** — `SkiaSharp.Views` split into dedicated packages: `SkiaSharp.Views.WPF`, `SkiaSharp.Views.WindowsForms`, `SkiaSharp.Views.Gtk3`, `SkiaSharp.Views.Gtk2`, and `SkiaSharp.Views.Desktop.Common`.
+- **GTK# 3 support** — New `SKDrawingArea` widget for GTK# 3 applications.
+
+### Xamarin.Forms
+
+- **WPF support** — Initial WPF backend via `SkiaSharp.Views.Forms.WPF`.
+- **Updated to Xamarin.Forms v4.x** — Compatibility with the latest Forms release.
+- **Mouse wheel support** — `SKCanvasView` and `SKGLView` now handle mouse wheel events. ❤️ @charlenni
+
+### HarfBuzz
+
+- **Updated to HarfBuzz 2.6.1** — Major version bump with new APIs. ❤️ @Gillibald
+- **Expanded HarfBuzz bindings** — Many new APIs for a more complete binding surface. ❤️ @Gillibald
+- **`Span` overloads for HarfBuzzSharp** — Consistent with SkiaSharp's new span support. ❤️ @Gillibald
+
+## Bug Fixes
+
+- Fixed several issues with static instances of native objects being accidentally destroyed.
+- Fixed several invalid memory operations in managed-native interop.
+- Fixed `SKDocument` underlying stream being destroyed prematurely.
+- Fixed typeface managed stream not being released correctly.
+- Fixed incorrect native library version in Full Framework Xamarin.Mac.
+- Fixed Android emulator rendering incorrect colors. ❤️ @inforithmics
+- Fixed `System.Drawing.Bitmap` to `SKPixmap` conversion. ❤️ @Odirb
+- Improved `SKSwapChainPanel` stability on UWP.
+
+## Maintenance
+
+- P/Invoke layer is now generated along with structs and enums.
+- Documentation moved to the [SkiaSharp-API-docs](https://github.com/mono/SkiaSharp-API-docs) repository.
+- Build improvements. ❤️ @danien
+- Documentation improvements. ❤️ @HankiDesign
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|---------------|
+| [@charlenni](https://github.com/charlenni) | `SKDrawable` bindings, mouse wheel support in Forms |
+| [@Gillibald](https://github.com/Gillibald) | HarfBuzz 2.6.1 upgrade, expanded APIs, `Span` overloads |
+| [@vexx32x](https://github.com/vexx32x) | Additional `SKRegion` members |
+| [@MarchingCube](https://github.com/MarchingCube) | Additional `SKPaint` and `SKMatrix` members |
+| [@alexandrvslv](https://github.com/alexandrvslv) | `SKShader` from `SKPicture` |
+| [@inforithmics](https://github.com/inforithmics) | Android emulator color fix |
+| [@Odirb](https://github.com/Odirb) | `System.Drawing.Bitmap` conversion fix |
+| [@danien](https://github.com/danien) | Build improvements |
+| [@HankiDesign](https://github.com/HankiDesign) | Documentation improvements |
+
+## Preview Builds
+
+Six preview builds (147, 153, 165, 169, 170, 172) were published between September and November 2019 leading up to this stable release.
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.0...v1.68.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.68.1)
+- [Milestone](https://github.com/mono/SkiaSharp/milestone/19)
diff --git a/documentation/docfx/releases/1.68.2.1.md b/documentation/docfx/releases/1.68.2.1.md
new file mode 100644
index 00000000000..578aaf637db
--- /dev/null
+++ b/documentation/docfx/releases/1.68.2.1.md
@@ -0,0 +1,20 @@
+# Version 1.68.2.1
+
+> **Packaging fix for strong naming** · Released May 2, 2020 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.68.2.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.68.2.1)
+
+## Highlights
+
+A small patch release to fix assemblies not being strong named properly.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- Fixed assemblies not being strong named properly ([#1267](https://github.com/mono/SkiaSharp/issues/1267))
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.2...v1.68.2.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.68.2.1)
diff --git a/documentation/docfx/releases/1.68.2.md b/documentation/docfx/releases/1.68.2.md
new file mode 100644
index 00000000000..8ce82fcbb3d
--- /dev/null
+++ b/documentation/docfx/releases/1.68.2.md
@@ -0,0 +1,141 @@
+# Version 1.68.2
+
+> **Rich API additions and performance improvements** · Released April 30, 2020 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.68.2) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.68.2)
+
+## Highlights
+
+This release brings a wealth of new drawing APIs to SKCanvas, floating-point color support via SKColorF, and significant performance gains from removing all use of reflection. Structs across the library now implement `IEquatable` with proper equality operators, and memory management has been improved with array pooling and lifetime fixes.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Drawing & Canvas
+
+- **SKColorF** — Added floating-point color type with overloads across the API for high-precision color workflows.
+- **SKCanvas.DrawAtlas** — Draw sprite atlases with per-sprite transforms and colors.
+- **SKCanvas.DrawPatch** — Draw Coons patches for advanced gradient meshes.
+- **SKCanvas.DrawArc** — Draw arcs directly on the canvas.
+- **SKCanvas.DrawRoundRectDifference** — Draw the difference between two rounded rectangles.
+
+### Imaging & Shaders
+
+- **SKImage.ToRasterImage() overload** — Request explicit pixel data loading when converting to a raster image.
+- **SKImage.ToTextureImage** — Copy a CPU-backed image to a GPU texture.
+- **ToShader() extensions** — Added `ToShader()` to `SKBitmap`, `SKImage`, and `SKPicture` for convenient shader creation.
+- **Perlin noise shaders** — Improved support for Perlin noise shader generation.
+
+### Geometry & Math
+
+- **SKMatrix helpers** — Added `Concat`, `PreConcat`, and `PostConcat` members for cleaner matrix composition.
+- **SKRegion operations** — Added "quick" reject/contains members and region iterators for faster spatial queries.
+
+### Struct Improvements
+
+- **IEquatable\** — All structs now implement `IEquatable` with proper `Equals`, `GetHashCode`, and equality operators.
+- **Readonly getters** — All struct getters are now `readonly` for better performance and correctness.
+- **EditorBrowsable(Never)** — Obsolete members are now hidden from IntelliSense.
+
+### Views & Platform Extensions
+
+- **GTK extensions** — Added extension methods for `SKRect`/`SKPoint`/`SKSize` conversion and image type conversions (`SKImage`/`SKBitmap`/`SKPixmap` ↔ `Pixbuf`).
+- **SkiaSharp.Views.Forms.GTK** — New package bringing SkiaSharp views to Xamarin.Forms on GTK.
+- **Mouse wheel scrolling** — Added scroll wheel support in Xamarin.Forms views. ❤️ [@alexandrvslv](https://github.com/alexandrvslv)
+- **Touch device type & pressure** — Added `SKTouchDeviceType` and touch pressure support on Android. ❤️ [@mscherotter](https://github.com/mscherotter)
+
+## Bug Fixes
+
+- Fixed passing `null` for image filters throwing an exception instead of being treated as no filter. ❤️ [@Ziriax](https://github.com/Ziriax)
+- Fixed passing `null` to `SKPathMeasure` throwing an exception. ❤️ [@Ziriax](https://github.com/Ziriax)
+- Fixed sampling issues with GPU-based views. ❤️ [@validvoid](https://github.com/validvoid)
+- Fixed memory leak and crash in Xamarin.Forms views. ❤️ [@zbyszekpy](https://github.com/zbyszekpy)
+- Fixed several object lifetime and disposal bugs across the library.
+
+## Performance
+
+- Removed all use of reflection for a significant performance boost. ❤️ [@Gillibald](https://github.com/Gillibald)
+- Made use of array pools where possible to reduce allocations.
+- Multiple memory management improvements throughout the library.
+
+## Maintenance
+
+- Updated to Visual Studio 2019 and .NET Core 3.0.
+- Multi-targeting improvements. ❤️ [@bender2k14](https://github.com/bender2k14)
+- Updated minimum Android to v4.1 (API 16).
+- Updated Android NDK to r19c, MSVC to v14.2, and Clang to v9.0.
+- Updated ANGLE to the latest commit.
+- Updated Xamarin.Forms dependency to v4.4+.
+
+## Known Issues
+
+- WACK test false positive with `vcruntime140_1_app.dll` — this is resolved in the Windows Insider SDK.
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@Ziriax](https://github.com/Ziriax) | Fixed null parameter handling in image filters and path measure |
+| [@Gillibald](https://github.com/Gillibald) | Removed all reflection usage for major performance gains |
+| [@validvoid](https://github.com/validvoid) | Fixed GPU view sampling issues |
+| [@alexandrvslv](https://github.com/alexandrvslv) | Added mouse wheel scrolling support |
+| [@mscherotter](https://github.com/mscherotter) | Added touch device type and pressure on Android |
+| [@zbyszekpy](https://github.com/zbyszekpy) | Fixed memory leak and crash in views |
+| [@bender2k14](https://github.com/bender2k14) | Multi-targeting improvements |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.1.1...v1.68.2)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.68.2)
+- [Milestone](https://github.com/mono/SkiaSharp/milestone/30)
+
+---
+
+## Preview 60 (April 13, 2020)
+
+Final preview with remaining bug fixes and stabilization before the GA release.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.2-preview.50...v1.68.2-preview.60)
+
+## Preview 50 (April 3, 2020)
+
+Continued memory management improvements and additional API polish.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.2-preview.45...v1.68.2-preview.50)
+
+## Preview 45 (March 24, 2020)
+
+Struct equality operators and `IEquatable` implementation across all value types.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.2-preview.43...v1.68.2-preview.45)
+
+## Preview 43 (March 18, 2020)
+
+Added `ToTextureImage` and expanded shader creation methods on imaging types.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.2-preview.39...v1.68.2-preview.43)
+
+## Preview 39 (February 27, 2020)
+
+New canvas drawing APIs including `DrawAtlas`, `DrawPatch`, and `DrawArc`.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.2-preview.29...v1.68.2-preview.39)
+
+## Preview 29 (February 6, 2020)
+
+SKRegion enhancements and SKMatrix helper methods.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.2-preview.21...v1.68.2-preview.29)
+
+## Preview 21 (January 20, 2020)
+
+GTK view extensions and Xamarin.Forms GTK package.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.2-preview.17...v1.68.2-preview.21)
+
+## Preview 17 (January 11, 2020)
+
+Initial preview with SKColorF support and reflection removal for performance.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.1.1...v1.68.2-preview.17)
diff --git a/documentation/docfx/releases/1.68.3.md b/documentation/docfx/releases/1.68.3.md
new file mode 100644
index 00000000000..9e66f002495
--- /dev/null
+++ b/documentation/docfx/releases/1.68.3.md
@@ -0,0 +1,22 @@
+# Version 1.68.3
+
+> **Performance improvements for frequently-used objects** · Released May 18, 2020 · [NuGet](https://www.nuget.org/packages/SkiaSharp/1.68.3) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v1.68.3)
+
+## Highlights
+
+This is a focused maintenance release that improves performance for the most frequently-used SkiaSharp objects and updates the Tizen SDK to v3.7.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- Performance improvements for most frequently-used objects
+- Updated Tizen SDK to v3.7
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.2.1...v1.68.3)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/1.68.3)
+- [Milestone](https://github.com/mono/SkiaSharp/milestone/35)
diff --git a/documentation/docfx/releases/2.80.0.md b/documentation/docfx/releases/2.80.0.md
new file mode 100644
index 00000000000..1c5e52a9678
--- /dev/null
+++ b/documentation/docfx/releases/2.80.0.md
@@ -0,0 +1,131 @@
+# Version 2.80.0
+
+> **Major milestone update with Vulkan, ARM, and text overhaul** · Released July 9, 2020 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.80.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.80.0)
+
+## Highlights
+
+This is the biggest SkiaSharp release in years, upgrading to Skia milestone 80 and adding broad new platform support. Vulkan backends land on Android, Windows, and Linux. ARM64 support comes to Windows (UWP and Win32), and ARM/ARM64 support arrives for Linux — including Raspberry Pi. Text processing has been entirely rewritten around the new `SKFont` type with `Span`-based APIs for near-zero-allocation performance. Native libraries are no longer embedded in managed DLLs, improving build times and giving developers better control over native assets. Three community contributors helped drive this release.
+
+## Breaking Changes
+
+### API Renames
+
+- **`SKEncoding` → `SKTextEncoding`** — The old `SKEncoding` enum is deprecated in favor of `SKTextEncoding`.
+- **`GRPixelConfig` deprecated** — Use `SKColorType` instead for GPU surface configuration.
+
+### Minimum Version Bumps
+
+- **UWP minimum** — Now requires Windows 10.0.16299 or later.
+- **.NET Framework minimum** — Now requires .NET Framework 4.6.2 or later.
+- **Xamarin.Forms minimum** — Now requires Xamarin.Forms 4.5+.
+
+### Color Space Rework
+
+- Several `SKColorSpace`-related types have been deprecated in favor of improved types with better access to transfer functions and ICC profiles. Usage of `SKMatrix44` is being phased out.
+
+### Text Processing Rewrite
+
+- `SKTextBlob` and `SKTextBlobBuilder` now focus on glyphs and only expose convenience members for text. The underlying text engine has moved to `SKFont`.
+
+### Native Library Packaging
+
+- Native libSkiaSharp binaries are no longer embedded in managed DLLs. This improves build performance but may require updating deployment configurations.
+
+## New Features
+
+### Engine
+
+- **Skia milestone 80** — Upgraded to the latest Skia engine with all upstream improvements. ([Native Changelogs](https://github.com/mono/SkiaSharp/wiki/Native-Changelogs))
+
+### GPU & Rendering
+
+- **Vulkan backend support** — Full Vulkan rendering support on Android, Windows, and Linux with new `GRVkBackendContext`, `GRVkImageInfo`, and related types. ❤️ @tuccio ❤️ @MarchingCube
+- **SharpVk integration** — New `GRSharpVkBackendContext` and extension methods for `GRVkExtensions` to use SharpVk objects directly.
+- **Streamlined GPU types** — `GRContext` and `GRGlInterface` creation and usage have been simplified.
+
+### Text
+
+- **`SKFont` type** — New text-focused type that is a subset of `SKPaint`, providing cleaner text APIs.
+- **`Span`-based text APIs** — Near-zero-allocation text processing across the text pipeline.
+- **Improved `DrawTextOnPath`** — `SKCanvas.DrawTextOnPath` now supports not warping characters, with a better managed implementation after native support was dropped in Skia. ❤️ @Ziriax
+- **Simplified `DrawShapedText`** — New overloads for `SKCanvas.DrawShapedText` via SkiaSharp.HarfBuzz for easier common cases.
+
+### API Surface
+
+- **`SKColorSpace` rework** — New types for accessing transfer functions and ICC profiles.
+- **`SKColorF` on `SKPaint`** — Get and set colors using `SKColorF` with optional color space support.
+- **`SKPath.ToWinding()`** — Convert paths to winding fill type.
+- **Additional `SKImageFilter` overloads** — More factory method overloads for image filters.
+- **Native version validation** — The managed library now validates the native library version and throws if incompatible. ([#1252](https://github.com/mono/SkiaSharp/pull/1252))
+
+### Platform
+
+- **Windows ARM64** — Full ARM64 support for both UWP and Win32 platforms.
+- **Linux ARM / ARM64** — Native binaries for Debian ARM, ARM64, and Raspberry Pi.
+- **Alpine / musl support** — Linux builds for Alpine and other musl-based distributions, including no-dependency variants.
+- **WASM static library (experimental)** — Pre-built `.a` file for WebAssembly via `SkiaSharp.NativeAssets.WebAssembly`, for manual linking or use with Uno Platform. ([#1389](https://github.com/mono/SkiaSharp/pull/1389))
+- **.NET Framework ARM** — Proper 32/64 bit and ARM library loading for .NET Framework apps.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🪟 Windows | ARM64 for UWP and Win32, Vulkan backend, Nano Server support |
+| 🐧 Linux | ARM / ARM64 / Raspberry Pi, Alpine / musl, Vulkan backend |
+| 🤖 Android | Vulkan backend |
+| 🌐 WebAssembly | Experimental static library package |
+| 🍎 Apple | Xamarin.Forms minimum bumped to 4.5+ |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@tuccio](https://github.com/tuccio) | Vulkan backend support |
+| [@MarchingCube](https://github.com/MarchingCube) | Vulkan backend support |
+| [@Ziriax](https://github.com/Ziriax) | Improved `DrawTextOnPath` with non-warping character support |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v1.68.3...v2.80.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.80.0)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.80.0)
+
+---
+
+## Preview Build 33 (July 1, 2020)
+
+Pre-release build leading up to the stable release.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/releases/tag/v2.80.0)
+
+---
+
+## Preview Build 24 (June 27, 2020)
+
+Pre-release build with ongoing stabilization.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/releases/tag/v2.80.0)
+
+---
+
+## Preview Build 14 (June 18, 2020)
+
+Pre-release build with ongoing stabilization.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/releases/tag/v2.80.0)
+
+---
+
+## Preview Build 12 (June 16, 2020)
+
+Pre-release build with ongoing stabilization.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/releases/tag/v2.80.0)
+
+---
+
+## Preview Build 3 (June 8, 2020)
+
+Initial preview of the 2.80.0 release cycle.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/releases/tag/v2.80.0)
diff --git a/documentation/docfx/releases/2.80.1.md b/documentation/docfx/releases/2.80.1.md
new file mode 100644
index 00000000000..0521c59a248
--- /dev/null
+++ b/documentation/docfx/releases/2.80.1.md
@@ -0,0 +1,35 @@
+# Version 2.80.1
+
+> **Hot-fix for glyph regression plus Uno Platform views** · Released July 14, 2020 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.80.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.80.1)
+
+## Highlights
+
+A quick follow-up to 2.80.0 that fixes a regression where `SKTypeface.GetGlyphs` changed meaning. This release also introduces the new `SkiaSharp.Views.Uno` package with CPU views for Android, iOS, and macOS — contributed by three community members.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- **`SKTypeface.GetGlyphs` regression** — Fixed the changed behavior of `SKTypeface.GetGlyphs` introduced in v2.80.0. ([#1398](https://github.com/mono/SkiaSharp/issues/1398))
+
+## New Features
+
+### Platform
+
+- **Uno Platform CPU views** — New `SkiaSharp.Views.Uno` package with CPU rendering views for Android, iOS, and macOS. ❤️ @jeromelaban ❤️ @ghuntley ❤️ @MartinZikmund
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@jeromelaban](https://github.com/jeromelaban) | Uno Platform CPU views |
+| [@ghuntley](https://github.com/ghuntley) | Uno Platform CPU views |
+| [@MartinZikmund](https://github.com/MartinZikmund) | Uno Platform CPU views |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.0...v2.80.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.80.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.80.1)
diff --git a/documentation/docfx/releases/2.80.2.md b/documentation/docfx/releases/2.80.2.md
new file mode 100644
index 00000000000..d1b2bd4512e
--- /dev/null
+++ b/documentation/docfx/releases/2.80.2.md
@@ -0,0 +1,101 @@
+# Version 2.80.2
+
+> **Bug-fix release with memory debugging and Uno GPU views** · Released September 12, 2020 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.80.2) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.80.2)
+
+## Highlights
+
+A stability-focused release fixing numerous bugs across image encoding, text rendering, interop, and native library loading. New memory debugging APIs (`SKGraphics`, `SKTraceMemoryDump`) help diagnose GPU memory usage. The Uno Platform views gain GPU support via `SKSwapChainPanel` and WASM CPU rendering. Two community contributors drove key fixes.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### API Surface
+
+- **Memory debugging APIs** — Added `SKGraphics` and `SKTraceMemoryDump` types, plus memory debugging members on `GRContext`, for inspecting GPU resource usage.
+- **`SKColorF` extension methods** — New extension methods in SkiaSharp.Views to convert between native platform colors and `SKColorF`.
+- **Xamarin.Forms `SKColorF` extensions** — Convert between Xamarin.Forms `Color` and `SKColorF`.
+- **Replacement methods for obsoleted members** — Added new methods to replace previously obsoleted APIs.
+
+### Platform
+
+- **Uno Platform WASM CPU views** — CPU rendering views for WASM via Uno Platform. ❤️ @jeromelaban ❤️ @ghuntley ❤️ @MartinZikmund
+- **Uno Platform GPU views** — New `SKSwapChainPanel` GPU view for Android, iOS, macOS, and WASM.
+
+## Bug Fixes
+
+- **`SKSurface.Create` origin ignored** — Fixed the origin parameter being ignored when creating surfaces. ❤️ @Ziriax
+- **`SKData` from non-seekable stream** — Fixed exception when creating `SKData` from a non-seekable stream.
+- **`SKCanvas.DrawTextOnPath` null reference** — Fixed `NullReferenceException` in `DrawTextOnPath`. ❤️ @Ziriax
+- **No-dependency builds using dependencies** — Fixed Linux "no dependencies" builds that were still linking against dependencies.
+- **Image subset encoding** — Fixed an issue where encoding a subset of some images would encode the entire original image instead.
+- **Text rendering crashes** — Fixed several text rendering issues and crashes.
+- **Transitive dependency native binaries** — Fixed native binaries not reaching the final app when only referenced as a transitive dependency (also fixed for HarfBuzzSharp).
+- **ASP.NET `DllNotFoundException`** — Fixed `DllNotFoundException` when running in ASP.NET.
+- **WASM interop** — Fixed invalid interop on WASM for some methods.
+- **`SKCanvas.DrawPoint` layering** — Fixed an issue with layering in `SKCanvas.DrawPoint`.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🐧 Linux | Fixed no-dependency builds |
+| 🌐 WebAssembly | WASM interop fixes, Uno CPU + GPU views |
+| 📦 General | Transitive dependency fix for native binaries, ASP.NET loading fix |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@Ziriax](https://github.com/Ziriax) | Fixed `SKSurface.Create` origin and `DrawTextOnPath` null reference |
+| [@jeromelaban](https://github.com/jeromelaban) | Uno Platform WASM CPU views |
+| [@ghuntley](https://github.com/ghuntley) | Uno Platform WASM CPU views |
+| [@MartinZikmund](https://github.com/MartinZikmund) | Uno Platform WASM CPU views |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.1...v2.80.2)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.80.2)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.80.2)
+
+---
+
+## Preview Build 36 (September 3, 2020)
+
+Stabilization and final bug fixes before the stable release.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.2-preview.33...v2.80.2-preview.36)
+
+---
+
+## Preview Build 33 (August 25, 2020)
+
+Continued bug fixes and stability improvements.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.2-preview.19...v2.80.2-preview.33)
+
+---
+
+## Preview Build 19 (August 4, 2020)
+
+Bug fixes for image encoding, text rendering, and native library loading.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.2-preview.18...v2.80.2-preview.19)
+
+---
+
+## Preview Build 18 (August 2, 2020)
+
+Initial fixes for transitive dependency and ASP.NET loading issues.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.2-preview.9...v2.80.2-preview.18)
+
+---
+
+## Preview Build 9 (July 27, 2020)
+
+First preview of the 2.80.2 release cycle with early bug fixes.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.1...v2.80.2-preview.9)
diff --git a/documentation/docfx/releases/2.80.3.md b/documentation/docfx/releases/2.80.3.md
new file mode 100644
index 00000000000..21dd1d6c024
--- /dev/null
+++ b/documentation/docfx/releases/2.80.3.md
@@ -0,0 +1,111 @@
+# Version 2.80.3
+
+> **Metal, runtime effects, WinUI, and .NET 5 support** · Released July 12, 2021 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.80.3) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.80.3)
+
+## Highlights
+
+A feature-packed release bringing Metal rendering APIs to Apple platforms, the new `SKRuntimeEffect` API for custom GPU shaders, WinUI 3 desktop support, macOS ARM64 (Apple Silicon) native builds, .NET 5.0 support, and .NET Interactive integration. This release also includes Exif SubIFD reading, `SKPicture` serialization, `GRContextOptions`, and improved musl system detection. Five community contributors helped shape this release.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### GPU & Rendering
+
+- **Metal API support** — Full Metal rendering backend for Apple platforms (iOS, macOS), bringing hardware-accelerated GPU rendering via Metal. ([#1394](https://github.com/mono/SkiaSharp/pull/1394), [#1598](https://github.com/mono/SkiaSharp/pull/1598), [#1615](https://github.com/mono/SkiaSharp/pull/1615))
+- **`SKRuntimeEffect` API** — New API for custom GPU shader effects using SkSL (Skia Shading Language). ([#1604](https://github.com/mono/SkiaSharp/pull/1604))
+- **`GRContextOptions`** — Exposed `GRContextOptions` for fine-grained control over GPU context creation. ([#1529](https://github.com/mono/SkiaSharp/pull/1529))
+- **`GRContext.IsAbandoned`** — Exposed the `IsAbandoned` property in the C# API. ([#1659](https://github.com/mono/SkiaSharp/pull/1659))
+- **GL surface creation resilience** — Better handling of GL surface creation failures. ❤️ @gmurray81 ([#1642](https://github.com/mono/SkiaSharp/pull/1642))
+
+### API Surface
+
+- **`SKPicture` serialization** — New bindings for serializing and deserializing `SKPicture` objects. ([#1514](https://github.com/mono/SkiaSharp/pull/1514))
+- **Exif SubIFD support** — Added support for reading the Exif SubIFD from image metadata. ([#1518](https://github.com/mono/SkiaSharp/pull/1518))
+- **ANGLE `GRGlInterface` outside UWP** — Allow creating ANGLE-based `GRGlInterface` from non-UWP environments. ❤️ @Mikolaytis ([#1519](https://github.com/mono/SkiaSharp/pull/1519))
+- **Stream copy optimization** — Eliminated unnecessary array allocations when copying streams. ([#1510](https://github.com/mono/SkiaSharp/pull/1510))
+
+### Platform
+
+- **macOS ARM64 (Apple Silicon)** — Native ARM64 build target for macOS. ([#1627](https://github.com/mono/SkiaSharp/pull/1627))
+- **.NET 5.0 support** — Updated to target .NET 5.0. ([#1697](https://github.com/mono/SkiaSharp/pull/1697))
+- **WinUI 3 Desktop support** — New views and rendering support for WinUI 3 desktop applications. ([#1696](https://github.com/mono/SkiaSharp/pull/1696), [#1741](https://github.com/mono/SkiaSharp/pull/1741))
+- **Uno Platform `SKXamlCanvas`** — Support for `SKXamlCanvas` on Uno Platform SkiaSharp backends v2.0. ([#1704](https://github.com/mono/SkiaSharp/pull/1704))
+- **.NET Interactive support** — SkiaSharp images can now be displayed directly in .NET Interactive notebooks. ([#1710](https://github.com/mono/SkiaSharp/pull/1710))
+- **Improved musl detection** — Properly detect and handle musl-based Linux systems. ([#1657](https://github.com/mono/SkiaSharp/pull/1657))
+- **Multiple emscripten WASM builds** — Includes all emscripten versions for WASM compatibility. ([#1590](https://github.com/mono/SkiaSharp/pull/1590))
+
+## Bug Fixes
+
+- **`SKMatrix.IsInvertible` crash** — Fixed a crash when calling `IsInvertible` on certain matrices. ([#1527](https://github.com/mono/SkiaSharp/pull/1527))
+- **Image pixel reading** — Fixed incorrect image pixel reading. ([#1636](https://github.com/mono/SkiaSharp/pull/1636))
+- **iOS font loading** — Fixed font loading issues on iOS. ([#1539](https://github.com/mono/SkiaSharp/pull/1539))
+- **Display link defensiveness** — More defensive handling in display link callbacks. ([#1620](https://github.com/mono/SkiaSharp/pull/1620))
+- **Buffer swap after resize** — Fixed buffer swap issues after surface resize. ([#1668](https://github.com/mono/SkiaSharp/pull/1668))
+- **WPF `SKElement.OnRender`** — `SKElement.OnRender` now does nothing if there is no `PresentationSource`, preventing crashes. ❤️ @HarlanHugh ([#1606](https://github.com/mono/SkiaSharp/pull/1606))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | Metal rendering, macOS ARM64 (Apple Silicon), iOS font loading fix |
+| 🪟 Windows | WinUI 3 Desktop support |
+| 🐧 Linux | Improved musl system detection |
+| 🌐 WebAssembly | Multiple emscripten builds, Uno `SKXamlCanvas` |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@gmurray81](https://github.com/gmurray81) | Improved GL surface creation failure handling |
+| [@HarlanHugh](https://github.com/HarlanHugh) | Fixed WPF `SKElement.OnRender` crash without `PresentationSource` |
+| [@Mikolaytis](https://github.com/Mikolaytis) | Enabled ANGLE `GRGlInterface` creation outside UWP |
+| [@jeromelaban](https://github.com/jeromelaban) | Uno Platform documentation updates |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.2...v2.80.3)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.80.3)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.80.3)
+
+---
+
+## Preview 93 (July 12, 2021)
+
+Added `SKXamlCanvas` support for Uno Platform SkiaSharp backends v2.0.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3-preview.90...v2.80.3-preview.93)
+
+---
+
+## Preview 90 (May 30, 2021)
+
+Major preview with Metal APIs, `SKRuntimeEffect`, macOS ARM64, .NET 5.0, WinUI Desktop, .NET Interactive, and musl detection improvements.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3-preview.40...v2.80.3-preview.90)
+
+---
+
+## Preview 40 (February 6, 2021)
+
+Added Metal APIs, `GRContextOptions`, WPF rendering fix, and build improvements.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3-preview.24...v2.80.3-preview.40)
+
+---
+
+## Preview 24 (January 27, 2021)
+
+WASM emscripten builds and build system updates.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3-preview.18...v2.80.3-preview.24)
+
+---
+
+## Preview 18 (November 10, 2020)
+
+Initial preview with `SKPicture` serialization, Exif SubIFD support, ANGLE improvements, stream optimization, and `SKMatrix.IsInvertible` fix.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.2...v2.80.3-preview.18)
diff --git a/documentation/docfx/releases/2.80.4.md b/documentation/docfx/releases/2.80.4.md
new file mode 100644
index 00000000000..c171382b133
--- /dev/null
+++ b/documentation/docfx/releases/2.80.4.md
@@ -0,0 +1,67 @@
+# Version 2.80.4
+
+> **Stability fixes for surface allocation and anti-alias edging** · Released May 21, 2022 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.80.4) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.80.4-preview.9)
+
+## Highlights
+
+A small maintenance release that improves resilience when GPU surface allocation fails, fixes `IsAntialias` to correctly control font edging, and addresses an ANGLE packaging issue with `zlib1.dll`. One community contributor drove the surface allocation fix.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- **Surface allocation failure handling** — Returns an empty surface instead of crashing when GPU surface allocation fails. ❤️ @richirisu ([#1784](https://github.com/mono/SkiaSharp/pull/1784))
+- **`IsAntialias` controls edging** — `IsAntialias` now correctly also controls the font edging setting. ([#1802](https://github.com/mono/SkiaSharp/pull/1802))
+- **ANGLE `zlib1.dll` packaging** — Fixed missing `zlib1.dll` output from ANGLE builds. ([#1807](https://github.com/mono/SkiaSharp/pull/1807))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🪟 Windows | Fixed ANGLE `zlib1.dll` packaging |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@richirisu](https://github.com/richirisu) | Fixed crash on GPU surface allocation failure |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3...v2.80.4)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.80.4)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.80.4)
+
+---
+
+## Preview 9 (May 11, 2022)
+
+CI infrastructure updates.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.4-preview.6...v2.80.4-preview.9)
+
+---
+
+## Preview 6 (September 28, 2021)
+
+Fixed ANGLE `zlib1.dll` packaging.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.4-preview.5...v2.80.4-preview.6)
+
+---
+
+## Preview 5 (September 13, 2021)
+
+Fixed surface allocation failure handling and `IsAntialias` edging control.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.4-preview.2...v2.80.4-preview.5)
+
+---
+
+## Preview 2 (August 19, 2021)
+
+Initial preview of the 2.80.4 release cycle.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3...v2.80.4-preview.2)
diff --git a/documentation/docfx/releases/2.88.0.md b/documentation/docfx/releases/2.88.0.md
new file mode 100644
index 00000000000..fb3e1a1e882
--- /dev/null
+++ b/documentation/docfx/releases/2.88.0.md
@@ -0,0 +1,208 @@
+# Version 2.88.0
+
+> **.NET 6, MAUI, and Mac Catalyst debut** · Released May 22, 2022 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.88.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.88.0)
+
+## Highlights
+
+A landmark release bringing SkiaSharp into the .NET 6 era. This version introduces first-class .NET MAUI views (both compatibility shims and native handlers), adds Mac Catalyst support, enables ASP.NET Blazor WebAssembly rendering, and splits the monolithic NuGet package into smaller per-platform native asset packages for faster restores and smaller deployments. Six community contributors helped shape the release.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Platform
+
+- **Mac Catalyst support** — Full support for Mac Catalyst, including framework-based native packaging and build task integration. ([#1681](https://github.com/mono/SkiaSharp/pull/1681), [#1760](https://github.com/mono/SkiaSharp/pull/1760))
+- **.NET MAUI views** — New `SKCanvasView` and `SKGLView` for .NET MAUI with both compatibility and handler-based implementations. ([#1678](https://github.com/mono/SkiaSharp/pull/1678))
+- **.NET 6 TFMs** — Added `net6.0-ios`, `net6.0-android`, `net6.0-macos`, `net6.0-maccatalyst`, and `net6.0-tvos` targets for the binding projects. ([#1707](https://github.com/mono/SkiaSharp/pull/1707))
+- **ASP.NET Blazor WebAssembly** — Render SkiaSharp content in Blazor WASM applications. ([#1811](https://github.com/mono/SkiaSharp/pull/1811))
+- **Xamarin.Forms on netcoreapp3.1** — Extended Xamarin.Forms support to .NET Core 3.1 desktop scenarios. ([#1774](https://github.com/mono/SkiaSharp/pull/1774))
+- **Emscripten 2.0.23 support** — Updated WASM builds for newer Emscripten toolchain. ❤️ @jeromelaban ([#1746](https://github.com/mono/SkiaSharp/pull/1746))
+- **Uno Platform 4.0** — Bumped Uno Platform support to version 4.0. ❤️ @jeromelaban ([#1873](https://github.com/mono/SkiaSharp/pull/1873))
+
+### Packaging
+
+- **Split native asset packages** — The SkiaSharp NuGet is now split into smaller per-platform `SkiaSharp.NativeAssets.*` packages for faster restore and reduced download size. ([#1758](https://github.com/mono/SkiaSharp/pull/1758))
+- **HarfBuzzSharp.NativeAssets packages** — HarfBuzz native assets also split into per-platform packages with Windows symbols included. ([#1797](https://github.com/mono/SkiaSharp/pull/1797))
+- **PDB files in packages** — Debug symbols now ship inside the NuGet packages for better debugging. ([#1781](https://github.com/mono/SkiaSharp/pull/1781))
+- **Software Bill of Materials (SBOM)** — SBOM manifest generation added to the build. ❤️ @mjbond-msft ([#1954](https://github.com/mono/SkiaSharp/pull/1954))
+
+### Engine
+
+- **WindowsAppSDK support** — Migrated Windows views to the Windows App SDK. ([#1800](https://github.com/mono/SkiaSharp/pull/1800))
+- **HarfBuzz updated to 2.8.2** — Brings the latest text shaping improvements. ([#1766](https://github.com/mono/SkiaSharp/pull/1766))
+- **New APIs** — Additional Skia APIs exposed to C#. ([#1828](https://github.com/mono/SkiaSharp/pull/1828))
+
+## Bug Fixes
+
+- **Fix NRE in .NET MAUI SKCanvasView** — Resolved a null reference when using the canvas view in MAUI. ❤️ @jsuarezruiz ([#1734](https://github.com/mono/SkiaSharp/pull/1734))
+- **Return empty surface on allocation failure** — Gracefully handle failed surface allocations instead of crashing. ❤️ @richirisu ([#1784](https://github.com/mono/SkiaSharp/pull/1784))
+- **`IsAntialias` now controls Edging** — Setting `IsAntialias` correctly updates the font edging mode. ([#1802](https://github.com/mono/SkiaSharp/pull/1802))
+- **Fix `IgnorePixelScaling` behavior** — Corrected how the `IgnorePixelScaling` property works on views. ([#1804](https://github.com/mono/SkiaSharp/pull/1804))
+- **Prevent infinite loop in Blazor SKCanvasView** — Fixed a rendering loop that could freeze Blazor apps. ❤️ @JensKrumsieck ([#1889](https://github.com/mono/SkiaSharp/pull/1889))
+- **HandleDictionary lock replaced with critical section** — Improved thread-safety on Windows by replacing `lock` with a lightweight critical section. ❤️ @toptensoftware ([#1817](https://github.com/mono/SkiaSharp/pull/1817))
+- **Never dispose native statics** — Prevents crashes from premature disposal of shared native objects. ([#1863](https://github.com/mono/SkiaSharp/pull/1863))
+- **Work around enums not being blittable** — Fixed interop issues with enum types in certain .NET runtimes. ([#1857](https://github.com/mono/SkiaSharp/pull/1857))
+- **LibraryLoader: Try libdl.so.2 before libdl.so on Linux** — Fixes library loading on newer Linux distributions. ❤️ @akoeplinger ([#2010](https://github.com/mono/SkiaSharp/pull/2010))
+- **Android: Don't include .so files in class libraries** — Corrected native library packaging for Android. ❤️ @jonathanpeppers ([#1895](https://github.com/mono/SkiaSharp/pull/1895))
+- **Android: Eliminate unnecessary Resource.designer.cs fields** — Reduced generated code size. ❤️ @jonathanpeppers ([#1812](https://github.com/mono/SkiaSharp/pull/1812))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | Mac Catalyst support, iOS view background fix, macOS Monterey CI |
+| 🪟 Windows | WindowsAppSDK migration, native symbols in packages |
+| 🐧 Linux | libdl.so.2 fallback for newer distros |
+| 🤖 Android | Leaner .so packaging, reduced Resource.designer.cs |
+| 🌐 WebAssembly | Blazor WASM support, Emscripten 2.0.23 |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@jsuarezruiz](https://github.com/jsuarezruiz) | Fixed NRE in MAUI SKCanvasView |
+| [@richirisu](https://github.com/richirisu) | Graceful surface allocation failure handling |
+| [@jonathanpeppers](https://github.com/jonathanpeppers) | Android packaging improvements |
+| [@toptensoftware](https://github.com/toptensoftware) | HandleDictionary critical section optimization |
+| [@JensKrumsieck](https://github.com/JensKrumsieck) | Fixed Blazor infinite loop |
+| [@mjbond-msft](https://github.com/mjbond-msft) | SBOM manifest generation |
+| [@jeromelaban](https://github.com/jeromelaban) | Emscripten 2.0.23, Uno 4.0 |
+| [@akoeplinger](https://github.com/akoeplinger) | Linux libdl.so.2 fallback |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3...v2.88.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.88.0)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.88.0)
+- [Samples](https://aka.ms/skiasharp/samples)
+
+---
+
+## Preview 256 (May 11, 2022)
+
+Building with .NET MAUI RC 2.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0-preview.254...v2.88.0-preview.256)
+
+---
+
+## Preview 254 (May 11, 2022)
+
+Updated to .NET MAUI RC 1 and macOS 11 build environment.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0-preview.232...v2.88.0-preview.254)
+
+---
+
+## Preview 232 (May 11, 2022)
+
+SBOM generation, MAUI Preview 14, and CI pipeline improvements.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0-preview.209...v2.88.0-preview.232)
+
+---
+
+## Preview 209 (May 11, 2022)
+
+CI improvements and Mac Catalyst workaround removals.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0-preview.187...v2.88.0-preview.209)
+
+---
+
+## Preview 187 (May 11, 2022)
+
+Android packaging fix and MAUI Preview 12 update.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0-preview.179...v2.88.0-preview.187)
+
+---
+
+## Preview 179 (January 18, 2022)
+
+Uno Platform 4.0 support.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3...v2.88.0-preview.179)
+
+---
+
+## Preview 178 (January 18, 2022)
+
+HandleDictionary critical section, Blazor infinite loop fix, and native statics disposal fix.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3...v2.88.0-preview.178)
+
+---
+
+## Preview 155 (January 18, 2022)
+
+Dependency updates across the board.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3...v2.88.0-preview.155)
+
+---
+
+## Preview 152 (October 22, 2021)
+
+New Skia APIs exposed to C#.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3...v2.88.0-preview.152)
+
+---
+
+## Preview 150 (October 11, 2021)
+
+ASP.NET Blazor WebAssembly support added.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3...v2.88.0-preview.150)
+
+---
+
+## Preview 145 (September 28, 2021)
+
+Windows native symbols and HarfBuzzSharp native asset packages.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0-preview.140...v2.88.0-preview.145)
+
+---
+
+## Preview 140 (September 28, 2021)
+
+ANGLE zlib1.dll output fix for Windows GPU rendering.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0-preview.139...v2.88.0-preview.140)
+
+---
+
+## Preview 139 (September 13, 2021)
+
+WindowsAppSDK migration, `IsAntialias`/`IgnorePixelScaling` fixes, and graceful surface allocation failure.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0-preview.127...v2.88.0-preview.139)
+
+---
+
+## Preview 127 (September 13, 2021)
+
+HarfBuzz 2.8.2 update, Xamarin.Forms netcoreapp3.1 support, and PDB files in packages.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0-preview.120...v2.88.0-preview.127)
+
+---
+
+## Preview 120 (August 10, 2021)
+
+Mac Catalyst support, split native asset packages, and Emscripten 2.0.23.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0-preview.61...v2.88.0-preview.120)
+
+---
+
+## Preview 61 (July 12, 2021)
+
+Initial .NET 6 TFMs and .NET MAUI views with compatibility and handler support.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.80.3...v2.88.0-preview.61)
diff --git a/documentation/docfx/releases/2.88.1.md b/documentation/docfx/releases/2.88.1.md
new file mode 100644
index 00000000000..051a6e4357f
--- /dev/null
+++ b/documentation/docfx/releases/2.88.1.md
@@ -0,0 +1,139 @@
+# Version 2.88.1
+
+> **Skottie animations, WinUI, and Tizen support** · Released August 17, 2022 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.88.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.88.1)
+
+## Highlights
+
+This release introduces Skottie (Lottie animation) support as a new standalone package, adds WinUI views for the Uno Platform, brings Tizen as a first-class TFM target, and enables nullable reference type annotations. Native dependencies are updated to address security issues in zlib, libexpat, libwebp, and libjpeg-turbo. Five community contributors made their first contributions.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### API Surface
+
+- **Skottie animation support** — New `SkiaSharp.Skottie` package for playing Lottie/Bodymovin animations backed by Skia's Skottie engine, including nullable attributes, `TimeSpan` overloads, non-seekable stream handling, and BOM support. ❤️ @jeromelaban ([#1987](https://github.com/mono/SkiaSharp/pull/1987), [#2091](https://github.com/mono/SkiaSharp/pull/2091), [#2119](https://github.com/mono/SkiaSharp/pull/2119), [#2126](https://github.com/mono/SkiaSharp/pull/2126), [#2167](https://github.com/mono/SkiaSharp/pull/2167))
+- **AVIF image encode format** — Exposed the AVIF encoder for saving images in AVIF format. ❤️ @mgood7123 ([#2154](https://github.com/mono/SkiaSharp/pull/2154))
+- **SKShaper text alignment** — `SKShaper` now respects the `SKPaint.TextAlign` property when shaping text. ❤️ @koolkdev ([#1910](https://github.com/mono/SkiaSharp/pull/1910))
+- **Nullable annotations** — Added nullable reference type annotations and newer TFMs across the library. ([#2120](https://github.com/mono/SkiaSharp/pull/2120))
+- **SKDataStream made writeable** — `SKDataStream` now supports write operations, matching `SKData` behavior. ([#2128](https://github.com/mono/SkiaSharp/pull/2128))
+
+### Platform
+
+- **WinUI support for Uno** — Added SkiaSharp views for Uno Platform's WinUI target. ❤️ @jeromelaban ([#2042](https://github.com/mono/SkiaSharp/pull/2042))
+- **Tizen TFM** — Added `net6.0-tizen` target framework for Samsung Tizen devices. ([#2099](https://github.com/mono/SkiaSharp/pull/2099))
+- **Emscripten 3.1.7** — Updated WASM builds for Emscripten 3.1.7. ❤️ @jeromelaban ([#2094](https://github.com/mono/SkiaSharp/pull/2094))
+- **Skottie on all .NET 6 platforms** — Skottie available on iOS, Android, Mac Catalyst, macOS, tvOS, and Tizen. ❤️ @jeromelaban ([#2133](https://github.com/mono/SkiaSharp/pull/2133))
+
+### Engine
+
+- **SKGLView backing scale factor** — `SKGLView` now reshapes when the window's `BackingScaleFactor` changes (e.g., moving between Retina and non-Retina displays). ❤️ @HarlanHugh ([#1854](https://github.com/mono/SkiaSharp/pull/1854))
+- **Internal library configuration** — Added an initial configuration system for internal library settings. ([#1856](https://github.com/mono/SkiaSharp/pull/1856))
+
+## Security
+
+- **Update zlib** — Fixed PNG loading issues by updating the bundled zlib. ([#2045](https://github.com/mono/SkiaSharp/pull/2045))
+- **Update libexpat to 2.4.8** — Addresses known vulnerabilities. ([#2189](https://github.com/mono/SkiaSharp/pull/2189))
+- **Update libwebp to 1.2.3** — Addresses known vulnerabilities. ([#2193](https://github.com/mono/SkiaSharp/pull/2193))
+- **Update libjpeg-turbo to 2.1.3** — Addresses known vulnerabilities. ([#2206](https://github.com/mono/SkiaSharp/pull/2206))
+
+## Bug Fixes
+
+- **Return null on invalid resize bounds** — Prevents crashes when calling resize with invalid dimensions. ([#2054](https://github.com/mono/SkiaSharp/pull/2054))
+- **Fix Alpine Linux builds** — Corrected native library loading on Alpine/musl-based distributions. ([#2168](https://github.com/mono/SkiaSharp/pull/2168), [#2192](https://github.com/mono/SkiaSharp/pull/2192))
+- **Fix critical section after deletion** — Prevents accessing a deleted critical section during HandleDictionary cleanup. ❤️ @RichardD2 ([#2195](https://github.com/mono/SkiaSharp/pull/2195))
+- **Fix font loading with Unicode names** — Fonts with Unicode characters in their names now load correctly. ❤️ @lindexi ([#2146](https://github.com/mono/SkiaSharp/pull/2146))
+- **Use full libc library name** — Fixes P/Invoke resolution on certain Linux configurations. ([#2213](https://github.com/mono/SkiaSharp/pull/2213))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | Skottie on iOS/macOS/tvOS/Mac Catalyst, SKGLView backing scale fix |
+| 🪟 Windows | WinUI views for Uno Platform |
+| 🐧 Linux | Alpine build fixes, full libc name resolution |
+| 🤖 Android | Skottie support |
+| 🌐 WebAssembly | Emscripten 3.1.7, Uno WinUI WASM support |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@jeromelaban](https://github.com/jeromelaban) | Skottie support, WinUI, Emscripten 3.1.7, multi-platform Skottie |
+| [@koolkdev](https://github.com/koolkdev) | SKShaper text alignment support |
+| [@mgood7123](https://github.com/mgood7123) | AVIF encode format |
+| [@HarlanHugh](https://github.com/HarlanHugh) | SKGLView backing scale factor reshape |
+| [@lindexi](https://github.com/lindexi) | Unicode font name loading fix |
+| [@RichardD2](https://github.com/RichardD2) | Critical section deletion fix |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0...v2.88.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.88.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.88.1)
+
+---
+
+## Preview 108 (August 12, 2022)
+
+Internal library configuration, full libc library name, and .NET updates.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.1-preview.104...v2.88.1-preview.108)
+
+---
+
+## Preview 104 (August 10, 2022)
+
+Security updates for libexpat, libwebp, and libjpeg-turbo. Alpine build fixes and Unicode font name loading.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.1-preview.91...v2.88.1-preview.104)
+
+---
+
+## Preview 91 (August 4, 2022)
+
+AVIF encode format, Skottie BOM support, Alpine build fixes, and XML documentation improvements.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.1-preview.79...v2.88.1-preview.91)
+
+---
+
+## Preview 79 (August 4, 2022)
+
+SKDataStream writeable, Skottie on all .NET 6 platform TFMs.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.1-preview.75...v2.88.1-preview.79)
+
+---
+
+## Preview 75 (August 4, 2022)
+
+SKGLView backing scale factor reshape and Skottie non-seekable stream handling.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.1-preview.71...v2.88.1-preview.75)
+
+---
+
+## Preview 71 (August 4, 2022)
+
+Nullable annotations and Skottie API improvements with TimeSpan overloads.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.1-preview.63...v2.88.1-preview.71)
+
+---
+
+## Preview 63 (August 4, 2022)
+
+Skottie animation support, WinUI for Uno, Tizen TFM, SKShaper text alignment, and Emscripten 3.1.7.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.1-preview.1...v2.88.1-preview.63)
+
+---
+
+## Preview 1 (May 22, 2022)
+
+Initial preview with zlib fix for PNG loading issues.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.0...v2.88.1-preview.1)
diff --git a/documentation/docfx/releases/2.88.2.md b/documentation/docfx/releases/2.88.2.md
new file mode 100644
index 00000000000..395b881321a
--- /dev/null
+++ b/documentation/docfx/releases/2.88.2.md
@@ -0,0 +1,36 @@
+# Version 2.88.2
+
+> **Tizen backend fix and Apple rect conversion** · Released September 8, 2022 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.88.2) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.88.2)
+
+## Highlights
+
+A focused patch release with three targeted fixes: Tizen's graphics backend engine is updated for better rendering, an unused native library block is cleaned up from the Uno WinUI packages, and `SKRect` to `CGRect` conversion on Apple platforms is corrected. One new community contributor joined.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- **Tizen graphics backend engine change** — Switched the Tizen graphics backend for improved rendering behavior. ❤️ @myroot ([#2225](https://github.com/mono/SkiaSharp/pull/2225))
+- **Remove unused native library block from Uno views** — Cleaned up unnecessary native library references in `SkiaSharp.Views.Uno.UI/WinUI`. ❤️ @jeromelaban ([#2231](https://github.com/mono/SkiaSharp/pull/2231))
+- **Fix SKRect to CGRect conversion** — Corrected the conversion between SkiaSharp rectangles and Apple Core Graphics rectangles on iOS/macOS. ([#2243](https://github.com/mono/SkiaSharp/pull/2243))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | Fixed `SKRect` to `CGRect` conversion |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@myroot](https://github.com/myroot) | Tizen graphics backend update |
+| [@jeromelaban](https://github.com/jeromelaban) | Uno WinUI cleanup |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.1...v2.88.2)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.88.2)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.88.2)
diff --git a/documentation/docfx/releases/2.88.3.md b/documentation/docfx/releases/2.88.3.md
new file mode 100644
index 00000000000..b0361c8e411
--- /dev/null
+++ b/documentation/docfx/releases/2.88.3.md
@@ -0,0 +1,48 @@
+# Version 2.88.3
+
+> **.NET 7 and Blazor support** · Released October 4, 2022 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.88.3) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.88.3)
+
+## Highlights
+
+This release adds .NET 7 build infrastructure and Blazor view support, updates the WASM backend to Emscripten 3.1.12 with SIMD features, fixes a Linux native library loading issue with `RTLD_DEEPBIND`, and corrects stream skip behavior. One new community contributor joined.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Platform
+
+- **.NET 7 build infrastructure** — Added build support for the .NET 7 SDK and runtime. ([#2255](https://github.com/mono/SkiaSharp/pull/2255))
+- **.NET 7 Blazor views** — SkiaSharp Blazor views now target .NET 7. ([#2254](https://github.com/mono/SkiaSharp/pull/2254))
+- **Emscripten 3.1.12 with SIMD** — WASM builds updated with Emscripten 3.1.12 and SIMD feature support for improved performance. ❤️ @jeromelaban ([#2259](https://github.com/mono/SkiaSharp/pull/2259))
+
+### Engine
+
+- **GL interception for .NET** — Intercept and capture OpenGL contexts for .NET-based GPU rendering. ([#2268](https://github.com/mono/SkiaSharp/pull/2268))
+
+## Bug Fixes
+
+- **Add `RTLD_DEEPBIND` flag to `dlopen`** — Prevents symbol conflicts when loading native libraries on Linux. ❤️ @snnz ([#2247](https://github.com/mono/SkiaSharp/pull/2247))
+- **Fix stream skip implementation** — Stream skip operations now correctly read to a null buffer instead of seeking, fixing issues with non-seekable streams. ([#2265](https://github.com/mono/SkiaSharp/pull/2265))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🐧 Linux | `RTLD_DEEPBIND` for safer native library loading |
+| 🌐 WebAssembly | Emscripten 3.1.12, SIMD features, .NET 7 Blazor |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@snnz](https://github.com/snnz) | `RTLD_DEEPBIND` flag for Linux `dlopen` |
+| [@jeromelaban](https://github.com/jeromelaban) | Emscripten 3.1.12 and SIMD features |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.2...v2.88.3)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.88.3)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.88.3)
diff --git a/documentation/docfx/releases/2.88.4.md b/documentation/docfx/releases/2.88.4.md
new file mode 100644
index 00000000000..8e0afe44c7e
--- /dev/null
+++ b/documentation/docfx/releases/2.88.4.md
@@ -0,0 +1,120 @@
+# Version 2.88.4
+
+> **.NET 8 preview, ARM64 macOS, and security updates** · Released August 22, 2023 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.88.4) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.88.4)
+
+## Highlights
+
+A substantial servicing release spanning nearly a year of work. Key additions include .NET 8 preview support, ARM64 macOS build machines, WASM multi-threading with SIMD, and Android `.aar` shipping in NuGet. Security updates cover zlib, libpng, and libexpat. Ten new community contributors helped fix disposal bugs, improve performance, and refine Uno Platform integration.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Platform
+
+- **.NET 8 Preview support** — Build infrastructure updated for .NET 8 Preview 4. ❤️ @jeromelaban ([#2457](https://github.com/mono/SkiaSharp/pull/2457))
+- **ARM64 macOS build machines** — Native builds now run on Apple Silicon (ARM64) macOS machines. ([#2468](https://github.com/mono/SkiaSharp/pull/2468))
+- **WASM multi-threading and SIMD** — Added multi-threaded and multi-threaded+SIMD WASM configurations. ❤️ @jeromelaban ([#2286](https://github.com/mono/SkiaSharp/pull/2286))
+- **WASM Exception Handling and SIMD for .NET 8+** — Enabled Wasm EH and SIMD in all configurations for .NET 8 and later. ❤️ @jeromelaban ([#2495](https://github.com/mono/SkiaSharp/pull/2495))
+- **Blazor .NET 8 assets** — New WASM assets included for Blazor on .NET 8. ([#2497](https://github.com/mono/SkiaSharp/pull/2497))
+- **JSImport for WinUI on .NET 7** — Moved from JS interop to modern `JSImport` for Uno WinUI WASM targets. ❤️ @jeromelaban ([#2428](https://github.com/mono/SkiaSharp/pull/2428))
+- **Ship .aar with Android NuGet** — Android Archive (`.aar`) now included in the NuGet for better Android tooling integration. ❤️ @dellis1972 ([#2465](https://github.com/mono/SkiaSharp/pull/2465))
+- **iOS Hot Restart NativeReference** — Added `NativeReference` metadata so iOS Hot Restart works correctly. ([#2553](https://github.com/mono/SkiaSharp/pull/2553))
+- **iOS Simulator RID artifacts** — The `iossimulator` RID now ships native assets. ([#2498](https://github.com/mono/SkiaSharp/pull/2498))
+- **Windows App SDK update** — Bumped to a newer Windows App SDK. ([#2276](https://github.com/mono/SkiaSharp/pull/2276))
+
+### Engine
+
+- **SKColor hex parsing performance** — Significantly improved hex string parsing performance for `SKColor`. ❤️ @jwikberg ([#2467](https://github.com/mono/SkiaSharp/pull/2467))
+- **CodeQL security scanning** — Enabled CodeQL analysis in CI for automated vulnerability detection. ❤️ @Redth ([#2303](https://github.com/mono/SkiaSharp/pull/2303))
+- **CVE binary tool scanning** — Added `cve-bin-tool` to CI for detecting known vulnerabilities in native binaries. ([#2490](https://github.com/mono/SkiaSharp/pull/2490))
+
+## Security
+
+- **Update zlib to 1.2.13** — Addresses known vulnerabilities in the compression library. ([#2484](https://github.com/mono/SkiaSharp/pull/2484))
+- **Update libpng to v1.6.40** — Addresses known vulnerabilities. ([#2510](https://github.com/mono/SkiaSharp/pull/2510))
+- **Update libexpat to 2.5.0** — Addresses known vulnerabilities. ([#2510](https://github.com/mono/SkiaSharp/pull/2510))
+
+## Bug Fixes
+
+- **Fix Tizen canvas size calculation** — Corrected how canvas dimensions are computed on Tizen. ❤️ @myroot ([#2322](https://github.com/mono/SkiaSharp/pull/2322))
+- **Fix Android ObjectDisposedException** — Added additional checks to avoid `ObjectDisposedException` on Android views. ❤️ @FoggyFinder ([#2313](https://github.com/mono/SkiaSharp/pull/2313))
+- **Fix SKCanvasView dispose before render** — Prevents exceptions when the view is disposed before its first render. ❤️ @jjzhang12 ([#2472](https://github.com/mono/SkiaSharp/pull/2472))
+- **Fix `ToRect` extension method** — Corrected the `ToRect` extension to return proper values. ❤️ @niza93 ([#2392](https://github.com/mono/SkiaSharp/pull/2392))
+- **Fix Uno opaque defaults on iOS/macOS** — Set `SKSwapChainPanel` and `SKXamlCanvas` to non-opaque by default for consistency. ❤️ @roubachof ([#2398](https://github.com/mono/SkiaSharp/pull/2398), [#2400](https://github.com/mono/SkiaSharp/pull/2400), [#2401](https://github.com/mono/SkiaSharp/pull/2401))
+- **Fix macOS opaque method** — Used the correct method for setting `Opaque` on macOS. ([#2477](https://github.com/mono/SkiaSharp/pull/2477))
+- **Fix bitmap SKAlphaType in WASM** — Corrected alpha type when rendering bitmaps in `SKXamlCanvas` on WASM. ❤️ @roubachof ([#2443](https://github.com/mono/SkiaSharp/pull/2443))
+- **Disambiguate SKGLView for Uno/MAUI** — Resolved type conflicts between Uno and MAUI `SKGLView` targets. ❤️ @jeromelaban ([#2529](https://github.com/mono/SkiaSharp/pull/2529))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | ARM64 macOS builds, iOS Hot Restart support, iOS Simulator RID, opaque fix |
+| 🪟 Windows | Updated Windows App SDK |
+| 🤖 Android | `.aar` in NuGet, `ObjectDisposedException` fix, canvas dispose fix |
+| 🌐 WebAssembly | Multi-threading, SIMD, .NET 8 Blazor, JSImport for WinUI, alpha type fix |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@Redth](https://github.com/Redth) | CodeQL security scanning |
+| [@roubachof](https://github.com/roubachof) | Uno opaque defaults and WASM alpha type fixes |
+| [@dellis1972](https://github.com/dellis1972) | Android `.aar` in NuGet |
+| [@FoggyFinder](https://github.com/FoggyFinder) | Android `ObjectDisposedException` guard |
+| [@jjzhang12](https://github.com/jjzhang12) | SKCanvasView dispose-before-render fix |
+| [@jwikberg](https://github.com/jwikberg) | SKColor hex parsing performance |
+| [@niza93](https://github.com/niza93) | `ToRect` extension method fix |
+| [@JamieMagee](https://github.com/JamieMagee) | `$schema` for `cgmanifest.json` |
+| [@Lehonti](https://github.com/Lehonti) | Code cleanup with block-scoped `using` |
+| [@myroot](https://github.com/myroot) | Tizen canvas size fix |
+| [@jeromelaban](https://github.com/jeromelaban) | WASM MT+SIMD, .NET 8, JSImport, SKGLView disambiguation |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.3...v2.88.4)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.88.4)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.88.4)
+
+---
+
+## Preview 96 (August 22, 2023)
+
+.NET SDK version tracking improvements.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.4-preview.95...v2.88.4-preview.96)
+
+---
+
+## Preview 95 (August 22, 2023)
+
+Updated libpng and libexpat, SKGLView disambiguation for Uno/MAUI, and iOS Hot Restart support.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.4-preview.82...v2.88.4-preview.95)
+
+---
+
+## Preview 82 (June 26, 2023)
+
+Blazor .NET 8 assets, `ToRect` fix, JSImport for WinUI, and iOS Simulator RID.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.4-preview.76...v2.88.4-preview.82)
+
+---
+
+## Preview 76 (June 19, 2023)
+
+ARM64 macOS builds, SKColor hex parsing performance, and WASM EH+SIMD for .NET 8.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.4-preview.70...v2.88.4-preview.76)
+
+---
+
+## Preview 70 (June 16, 2023)
+
+Initial preview with .NET 5 SDK removal, Windows App SDK update, WASM multi-threading, zlib 1.2.13, CodeQL scanning, and multiple Uno/Android/Tizen bug fixes.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.3...v2.88.4-preview.70)
diff --git a/documentation/docfx/releases/2.88.5.md b/documentation/docfx/releases/2.88.5.md
new file mode 100644
index 00000000000..59bccd5f7b6
--- /dev/null
+++ b/documentation/docfx/releases/2.88.5.md
@@ -0,0 +1,36 @@
+# Version 2.88.5
+
+> **Uno Platform and rectangle conversion fixes** · Released August 23, 2023 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.88.5) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.88.5)
+
+## Highlights
+
+SkiaSharp 2.88.5 is a targeted patch release that fixes canvas rendering issues on the Uno Platform (including WebAssembly) and corrects outward rounding when converting `SKRect` to `SKRectI`. One community contributor drove two of the three fixes.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- **Uno canvas context not active during rendering** — Fixed an issue where the canvas GL context was not properly activated before rendering on Uno Platform targets. ❤️ @jeromelaban ([#2560](https://github.com/mono/SkiaSharp/pull/2560))
+- **WASM canvas lookup failure** — `SKXamlCanvas` on WebAssembly no longer throws when the underlying canvas element cannot be found. ❤️ @jeromelaban ([#2564](https://github.com/mono/SkiaSharp/pull/2564))
+- **`SKRect` to `SKRectI` rounding** — `SKRect` now floors outward correctly when converting to `SKRectI`, preventing off-by-one pixel clipping. ([#2574](https://github.com/mono/SkiaSharp/pull/2574))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🌐 WebAssembly | Canvas lookup failure fix for WASM targets |
+| 🎨 Core API | Correct outward rounding for `SKRect` → `SKRectI` conversion |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@jeromelaban](https://github.com/jeromelaban) | Uno canvas context fix; WASM canvas lookup fix |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.4...v2.88.5)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.88.5)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.88.5)
diff --git a/documentation/docfx/releases/2.88.6.md b/documentation/docfx/releases/2.88.6.md
new file mode 100644
index 00000000000..f0aefb4b168
--- /dev/null
+++ b/documentation/docfx/releases/2.88.6.md
@@ -0,0 +1,50 @@
+# Version 2.88.6
+
+> **Native dependency updates and WASM compatibility** · Released September 21, 2023 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.88.6) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.88.6)
+
+## Highlights
+
+SkiaSharp 2.88.6 updates several bundled native libraries — HarfBuzz to 7.3.0, libjpeg-turbo to 3.0.0, and libwebp to 1.3.2 — keeping the dependency chain current and addressing known issues. The release also restores non-SIMD WebAssembly builds needed for Microsoft Edge Enhanced Security mode and Safari compatibility.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Dependencies
+
+- **HarfBuzz updated to 7.3.0** — Bumped the bundled HarfBuzz text-shaping library. ([#2577](https://github.com/mono/SkiaSharp/pull/2577))
+- **libjpeg-turbo updated to 3.0.0** — Bumped the bundled JPEG codec library. ([#2581](https://github.com/mono/SkiaSharp/pull/2581))
+- **libwebp updated to 1.3.2** — Bumped the bundled WebP codec library. ([#2623](https://github.com/mono/SkiaSharp/pull/2623))
+
+## Bug Fixes
+
+- **Restore non-SIMD WASM builds** — Re-added non-SIMD WebAssembly builds required for Edge Enhanced Security mode and older Safari versions. ❤️ @jeromelaban ([#2618](https://github.com/mono/SkiaSharp/pull/2618))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🌐 WebAssembly | Non-SIMD builds restored for Edge Enhanced Security and Safari compatibility |
+| 🍎 Apple | Removed unused arm64e architecture slice |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@jeromelaban](https://github.com/jeromelaban) | Restored non-SIMD WASM builds for browser compatibility |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.5...v2.88.6)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.88.6)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.88.6)
+
+---
+
+## Preview 1 (August 31, 2023)
+
+Updated HarfBuzz to 7.3.0 and libjpeg-turbo to 3.0.0, and removed the unused arm64e Apple architecture slice.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.5...v2.88.6-preview.1.2)
diff --git a/documentation/docfx/releases/2.88.7.md b/documentation/docfx/releases/2.88.7.md
new file mode 100644
index 00000000000..9450db8c666
--- /dev/null
+++ b/documentation/docfx/releases/2.88.7.md
@@ -0,0 +1,21 @@
+# Version 2.88.7
+
+> **libjpeg-turbo rollback for stability** · Released January 11, 2024 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.88.7) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.88.7)
+
+## Highlights
+
+SkiaSharp 2.88.7 reverts the libjpeg-turbo update from 2.88.6 back to version 2.1.5.1 to address compatibility issues introduced by the 3.0.0 upgrade. This is a focused stability patch with no other user-facing changes.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- **Reverted libjpeg-turbo to 2.1.5.1** — Rolled back the libjpeg-turbo update (from 3.0.0 in v2.88.6) to version 2.1.5.1 to resolve compatibility issues. ([#2702](https://github.com/mono/SkiaSharp/pull/2702))
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.6...v2.88.7)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.88.7)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.88.7)
diff --git a/documentation/docfx/releases/2.88.8.md b/documentation/docfx/releases/2.88.8.md
new file mode 100644
index 00000000000..5f5f2123d68
--- /dev/null
+++ b/documentation/docfx/releases/2.88.8.md
@@ -0,0 +1,44 @@
+# Version 2.88.8
+
+> **Trimming, OpenGL, and API compatibility improvements** · Released April 10, 2024 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.88.8) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.88.8)
+
+## Highlights
+
+SkiaSharp 2.88.8 fixes tvOS compilation with trimming enabled, eliminates an `async void` issue in `SKXamlCanvas`, and hides missing OpenGL functions on Windows to prevent runtime errors. The release also adds new method overloads for improved API compatibility.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### API Surface
+
+- **New method overloads for compatibility** — Added additional overloads to improve compatibility with various consuming patterns. ([#2810](https://github.com/mono/SkiaSharp/pull/2810))
+
+## Bug Fixes
+
+- **Hidden unavailable OpenGL functions on Windows** — Functions that `opengl32.dll` does not actually export are no longer surfaced, preventing `EntryPointNotFoundException` at runtime. ([#2710](https://github.com/mono/SkiaSharp/pull/2710))
+- **Eliminated `async void` in `SKXamlCanvas`** — Replaced `async void` with a safer async pattern to prevent unobserved exceptions in XAML canvas rendering. ([#2731](https://github.com/mono/SkiaSharp/pull/2731))
+- **tvOS compilation with trimming** — Made `PlatformConfiguration` properties trimmable, fixing compilation failures on tvOS when trimming is enabled. ([#2734](https://github.com/mono/SkiaSharp/pull/2734))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | tvOS compilation fixed when trimming is enabled |
+| 🪟 Windows | Hidden unavailable OpenGL entry points in `opengl32.dll` |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.7...v2.88.8)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.88.8)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.88.8)
+
+---
+
+## Preview 1 (April 5, 2024)
+
+All fixes and features in this release were included in Preview 1: OpenGL function visibility fix, `async void` elimination, tvOS trimming fix, and new API overloads.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.7...v2.88.8-preview.1.1)
diff --git a/documentation/docfx/releases/2.88.9.md b/documentation/docfx/releases/2.88.9.md
new file mode 100644
index 00000000000..6caade19ece
--- /dev/null
+++ b/documentation/docfx/releases/2.88.9.md
@@ -0,0 +1,64 @@
+# Version 2.88.9
+
+> **.NET 9 support, WinUI fixes, and debug symbols** · Released November 7, 2024 · [NuGet](https://www.nuget.org/packages/SkiaSharp/2.88.9) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v2.88.9)
+
+## Highlights
+
+SkiaSharp 2.88.9 adds .NET 9 target framework support, ships debug symbols in NuGet packages for improved diagnostics, and fixes several canvas and text API issues across Uno/WinUI and XAML platforms. One community contributor drove key WinUI and platform fixes.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Platform
+
+- **.NET 9 support** — Added target framework support for .NET 9. ([#3012](https://github.com/mono/SkiaSharp/pull/3012))
+- **Debug symbols in NuGet packages** — Symbol packages are now included, enabling source-level debugging and better stack traces. ([#3046](https://github.com/mono/SkiaSharp/pull/3046))
+
+### API Surface
+
+- **WinUI `GetByteBuffer` native helper** — Added a native helper method for `GetByteBuffer` on WinUI, improving interop for byte buffer scenarios. ❤️ @jeromelaban ([#3039](https://github.com/mono/SkiaSharp/pull/3039))
+
+## Bug Fixes
+
+- **`XamlRoot` null check on unload** — `SKXamlCanvas` no longer throws when `XamlRoot` is null during unload. ([#2884](https://github.com/mono/SkiaSharp/pull/2884))
+- **`GetKerningPairAdjustments` API fixed** — Corrected the kerning pair adjustments API to return proper values. ([#2886](https://github.com/mono/SkiaSharp/pull/2886))
+- **`SKXamlCanvas` pixel format on Uno Skia** — Fixed `SKXamlCanvas` on Uno Skia targets to use `Bgra8888` for correct color rendering. ([#2919](https://github.com/mono/SkiaSharp/pull/2919))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🪟 Windows | WinUI `GetByteBuffer` native helper |
+| 🌐 WebAssembly | `SKXamlCanvas` pixel format fix on Uno Skia |
+| 📦 General | .NET 9 support; debug symbols in packages |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@jeromelaban](https://github.com/jeromelaban) | WinUI `GetByteBuffer` native helper |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.8...v2.88.9)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/2.88.9)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/2.88.9)
+
+---
+
+## Preview 2 (October 24, 2024)
+
+Added .NET 9 target framework support and WinUI `GetByteBuffer` native helper.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.9-preview.1.1...v2.88.9-preview.2.2)
+
+---
+
+## Preview 1 (July 18, 2024)
+
+Fixed `XamlRoot` null reference on canvas unload, corrected `GetKerningPairAdjustments` API, and fixed `SKXamlCanvas` pixel format on Uno Skia. Also adopted new NuGet license expressions.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.8...v2.88.9-preview.1.1)
diff --git a/documentation/docfx/releases/3.0.0.md b/documentation/docfx/releases/3.0.0.md
new file mode 100644
index 00000000000..9708b31934c
--- /dev/null
+++ b/documentation/docfx/releases/3.0.0.md
@@ -0,0 +1,148 @@
+# Version 3.0.0
+
+> **Major version overhaul** · Previews released February – October 2024 · [NuGet](https://www.nuget.org/packages/SkiaSharp/3.0.0-preview.5.4) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v3.0.0-preview.5.4)
+
+## Highlights
+
+SkiaSharp 3.0 is a major overhaul of the library, modernizing the interop layer with function pointers and `LibraryImport`, upgrading the Skia engine to milestone 116, and adding .NET 8 and .NET 9 support. This release removes all previously deprecated APIs and introduces new features including `SKBlender`, Skottie Animation Builder, Metal on Mac Catalyst, GPU-accelerated views for MAUI, WPF, and WinUI, and `Span`-based API overloads throughout. Ten community contributors drove significant features and bug fixes across the preview series.
+
+> [!NOTE]
+> Version 3.0.0 was released only as previews. The first stable release in the 3.x line is [3.116.0](3.116.0.md), which adopted milestone-based versioning.
+
+## Breaking Changes
+
+### Removed Deprecated APIs
+
+- **All `[Obsolete]` members and types removed** — Previously deprecated APIs have been removed to clean up the API surface. See the [full API diff](https://github.com/mono/SkiaSharp/blob/main/changelogs/SkiaSharp/3.0.0/SkiaSharp.humanreadable.md) for details. ([#2539](https://github.com/mono/SkiaSharp/pull/2539))
+
+### API Cleanup
+
+- **SKTextBlobBuilder and SKRunBuffer APIs cleaned up** — Streamlined text blob builder APIs for consistency. ([#2775](https://github.com/mono/SkiaSharp/pull/2775))
+- **Compatibility APIs added and removed** — Some APIs were added for backward compatibility while others were removed as part of the 3.0 transition. ([#2789](https://github.com/mono/SkiaSharp/pull/2789))
+
+## New Features
+
+### Engine
+
+- **Skia updated to milestone 116** — Core graphics engine updated through milestones 115 and 116 for the latest rendering improvements. ([#2547](https://github.com/mono/SkiaSharp/pull/2547), [#2829](https://github.com/mono/SkiaSharp/pull/2829))
+- **Function pointers and LibraryImport** — Modernized P/Invoke layer using function pointers and `LibraryImport` for improved performance and AOT compatibility. ❤️ @maxkatz6 ([#2917](https://github.com/mono/SkiaSharp/pull/2917))
+- **Performance improvements with Unsafe.As** — Internal performance optimizations using `Unsafe.As` for type conversions. ([#2780](https://github.com/mono/SkiaSharp/pull/2780))
+
+### API Surface
+
+- **SKBlender exposed** — New `SKBlender` type for custom blending operations. ([#2830](https://github.com/mono/SkiaSharp/pull/2830))
+- **SKImage.ToRawShader** — Create shaders from images with raw (non-color-managed) data. ([#2748](https://github.com/mono/SkiaSharp/pull/2748))
+- **Skottie Animation Builder** — Bound Skottie's Animation Builder for Lottie animation support. ([#2630](https://github.com/mono/SkiaSharp/pull/2630))
+- **Additional SKPicture APIs** — Extended the `SKPicture` API surface with new methods. ([#2883](https://github.com/mono/SkiaSharp/pull/2883))
+- **R-Tree overload for BeginRecording** — Enables spatial indexing for recorded drawing operations. ([#2889](https://github.com/mono/SkiaSharp/pull/2889))
+- **GetPixelSpan() with offsets** — Access pixel data at specific offsets without copying. ([#2609](https://github.com/mono/SkiaSharp/pull/2609))
+- **Span overloads for color filters** — Memory-efficient `Span`-based overloads for color filter APIs. ([#2879](https://github.com/mono/SkiaSharp/pull/2879))
+- **Span overload for SetRectRadii** — Memory-efficient overload for setting rounded rectangle radii. ❤️ @Youssef1313 ([#2949](https://github.com/mono/SkiaSharp/pull/2949))
+- **SKFilterQuality compatibility overloads** — Backward-compatible overloads easing migration from the removed filter quality API. ❤️ @Youssef1313 ([#2963](https://github.com/mono/SkiaSharp/pull/2963))
+- **Text-based blobs restored** — Re-added text-based blob creation APIs that were removed in the initial cleanup. ([#2545](https://github.com/mono/SkiaSharp/pull/2545))
+
+### GPU & Rendering
+
+- **Metal backend on Mac Catalyst** — Use Metal as the GPU backend on Mac Catalyst for hardware-accelerated rendering. ([#2747](https://github.com/mono/SkiaSharp/pull/2747))
+- **Metal APIs on common .NET TFM** — Metal GPU APIs are now available on a common target framework, simplifying cross-platform GPU code. ❤️ @maxkatz6 ([#2788](https://github.com/mono/SkiaSharp/pull/2788))
+- **ANGLE built separately** — ANGLE (OpenGL ES backend for Windows) is now built as a separate component. ([#2950](https://github.com/mono/SkiaSharp/pull/2950))
+
+### Platform
+
+- **.NET 8 and .NET 9 support** — Updated target frameworks to support .NET 8 and .NET 9. ❤️ @jeromelaban (.NET 9) ([#2927](https://github.com/mono/SkiaSharp/pull/2927), [#3010](https://github.com/mono/SkiaSharp/pull/3010))
+- **SKGLView for .NET MAUI** — Hardware-accelerated OpenGL view for MAUI applications. ([#2598](https://github.com/mono/SkiaSharp/pull/2598))
+- **SKGLElement for WPF** — Hardware-accelerated OpenGL element for WPF applications. ❤️ @gmurray81 ([#2317](https://github.com/mono/SkiaSharp/pull/2317))
+- **WinUI accelerated views** — GPU-accelerated rendering views for WinUI applications. ([#2733](https://github.com/mono/SkiaSharp/pull/2733))
+- **Updated GLControl for WinForms** — Switched to the new GLControl packages for Windows Forms. ([#2989](https://github.com/mono/SkiaSharp/pull/2989))
+- **Blazor DPI exposure** — Expose DPI information in Blazor components for high-DPI rendering. ❤️ @beto-rodriguez ([#1832](https://github.com/mono/SkiaSharp/pull/1832))
+- **Trimmable PlatformConfiguration (tvOS fix)** — Made platform configuration properties trimmable, fixing tvOS compilation. ❤️ @maxkatz6 ([#2717](https://github.com/mono/SkiaSharp/pull/2717))
+- **AOT-compatible IBufferByteAccess** — Updated `IBufferByteAccess` for ahead-of-time compilation compatibility. ([#2920](https://github.com/mono/SkiaSharp/pull/2920))
+- **WASM no-SIMD builds** — Restored no-SIMD builds for Edge enhanced security mode and Safari compatibility. ❤️ @jeromelaban ([#2612](https://github.com/mono/SkiaSharp/pull/2612))
+
+### Dependencies
+
+- **HarfBuzz updated to 8.3.0** — Text shaping engine updated from 7.3.0 through to 8.3.0. ([#2582](https://github.com/mono/SkiaSharp/pull/2582), [#2624](https://github.com/mono/SkiaSharp/pull/2624))
+- **libwebp updated to 1.3.2** — WebP codec updated for bug fixes and improvements. ([#2622](https://github.com/mono/SkiaSharp/pull/2622))
+
+## Bug Fixes
+
+- **MAUI view memory leaks fixed** — Resolved memory leaks in MAUI views. ([#2955](https://github.com/mono/SkiaSharp/pull/2955))
+- **SKPaint.Clone fixed** — Corrected the clone behavior for paint objects. ❤️ @jeremy-visionaid ([#2904](https://github.com/mono/SkiaSharp/pull/2904))
+- **GetKerningPairAdjustments API fixed** — Corrected the kerning pair adjustments API. ❤️ @pdjonov ([#2858](https://github.com/mono/SkiaSharp/pull/2858))
+- **SKXamlCanvas Bgra8888 on Uno Skia** — Fixed color format for `SKXamlCanvas` on Uno Skia platform. ❤️ @Youssef1313 ([#2918](https://github.com/mono/SkiaSharp/pull/2918))
+- **Apple Metal snapshot magenta fix** — Fixed snapshot returning magenta color on Apple Metal. ❤️ @taublast ([#2804](https://github.com/mono/SkiaSharp/pull/2804))
+- **SKRectI floor conversion** — Fixed floor-outward rounding when converting to `SKRectI`. ([#2568](https://github.com/mono/SkiaSharp/pull/2568))
+- **SKBitmap.Encode behavior reverted** — Reverted `SKBitmap.Encode` with `SKPngEncoderOptions` to the 2.88.8 behavior. ❤️ @sungaila ([#3014](https://github.com/mono/SkiaSharp/pull/3014))
+- **Async void removed from SKXamlCanvas** — Eliminated async void pattern in `SKXamlCanvas` for better error handling. ❤️ @lindexi ([#2720](https://github.com/mono/SkiaSharp/pull/2720))
+- **XamlRoot null check on unload** — Fixed null reference when `SKXamlCanvas` is unloaded. ❤️ @jeromelaban ([#2854](https://github.com/mono/SkiaSharp/pull/2854))
+- **Uno canvas rendering context** — Ensured the canvas context is active when rendering on Uno. ❤️ @jeromelaban ([#2559](https://github.com/mono/SkiaSharp/pull/2559))
+- **WASM canvas graceful failure** — Don't fail when the canvas can't be found in WASM. ❤️ @jeromelaban ([#2563](https://github.com/mono/SkiaSharp/pull/2563))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | Metal on Mac Catalyst, Metal APIs on common TFM, fixed snapshot magenta on Metal, trimmable tvOS |
+| 🪟 Windows | WinUI accelerated views, updated GLControl for WinForms, ANGLE built separately |
+| 🌐 WebAssembly | Blazor DPI exposure, no-SIMD builds for Edge/Safari, canvas graceful failure |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@maxkatz6](https://github.com/maxkatz6) | Function pointers and LibraryImport, Metal APIs on common TFM, trimmable tvOS |
+| [@jeromelaban](https://github.com/jeromelaban) | .NET 9 support, Uno canvas fixes, WASM no-SIMD builds |
+| [@Youssef1313](https://github.com/Youssef1313) | Span overloads for SetRectRadii, SKFilterQuality compatibility, Uno Bgra8888 fix |
+| [@gmurray81](https://github.com/gmurray81) | SKGLElement for WPF |
+| [@taublast](https://github.com/taublast) | Fixed Apple Metal snapshot magenta color |
+| [@beto-rodriguez](https://github.com/beto-rodriguez) | Exposed Blazor components DPI |
+| [@pdjonov](https://github.com/pdjonov) | Fixed GetKerningPairAdjustments API |
+| [@jeremy-visionaid](https://github.com/jeremy-visionaid) | Fixed SKPaint.Clone |
+| [@lindexi](https://github.com/lindexi) | Removed async void from SKXamlCanvas |
+| [@sungaila](https://github.com/sungaila) | Reverted SKBitmap.Encode to 2.88.8 behavior |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.7...v3.0.0-preview.5.4)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/3.0.0-preview.5.4)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/3.0.0)
+
+---
+
+## Preview 5 (October 24, 2024)
+
+Updated .NET to 8.0, added function pointers and LibraryImport for modern interop, Span overloads for SetRectRadii and SKFilterQuality, fixed MAUI memory leaks, and added .NET 9 support.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.0.0-preview.4.1...v3.0.0-preview.5.4)
+
+---
+
+## Preview 4 (July 18, 2024)
+
+Updated Skia to milestone 116, exposed SKBlender, added Span-based color filter overloads, additional SKPicture and R-Tree recording APIs, and multiple Uno/XAML bug fixes.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.0.0-preview.3.1...v3.0.0-preview.4.1)
+
+---
+
+## Preview 3 (April 10, 2024)
+
+Added SKGLElement for WPF, cleaned up text blob APIs, exposed Blazor DPI, brought Metal APIs to common TFM, and fixed Apple Metal snapshot color issues.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.0.0-preview.2.1...v3.0.0-preview.3.1)
+
+---
+
+## Preview 2 (February 20, 2024)
+
+Added SKImage.ToRawShader, Metal backend on Mac Catalyst, and bound Skottie's Animation Builder.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.0.0-preview.1.8...v3.0.0-preview.2.1)
+
+---
+
+## Preview 1 (February 6, 2024)
+
+Initial SkiaSharp 3.0 preview: modernized repository, updated Skia to milestone 115, removed deprecated APIs, added SKGLView for MAUI, WinUI accelerated views, and dev container support.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v2.88.7...v3.0.0-preview.1.8)
diff --git a/documentation/docfx/releases/3.116.0.md b/documentation/docfx/releases/3.116.0.md
new file mode 100644
index 00000000000..0a7dd51dbe4
--- /dev/null
+++ b/documentation/docfx/releases/3.116.0.md
@@ -0,0 +1,59 @@
+# Version 3.116.0
+
+> **First stable milestone-based release** · Released December 3, 2024 · [NuGet](https://www.nuget.org/packages/SkiaSharp/3.116.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v3.116.0)
+
+## Highlights
+
+SkiaSharp 3.116.0 is the first stable release in the 3.x line, adopting milestone-based versioning that aligns with the underlying Skia engine version. This release adds `Span`-based overloads for `SKMatrix` and `SKPath`, multi-threaded and SIMD WebAssembly support, and resolves .NET 9 Blazor compatibility issues. Two community contributors added new API surface and updated the Skia engine.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### API Surface
+
+- **SKMatrix.MapPoints/MapVectors and SKPath.AddPoly Span overloads** — Added memory-efficient `Span` overloads for mapping points, mapping vectors, and adding polygons. ❤️ @alexandrvslv ([#3030](https://github.com/mono/SkiaSharp/pull/3030))
+
+### Platform
+
+- **Multi-thread and SIMD WebAssembly** — Added support for multi-threaded and/or SIMD WebAssembly builds, enabling significantly better performance in browser scenarios. ([#2620](https://github.com/mono/SkiaSharp/pull/2620))
+
+### Engine
+
+- **Skia engine updated** — Updated the underlying Skia engine. ❤️ @Redth ([#3026](https://github.com/mono/SkiaSharp/pull/3026))
+
+## Bug Fixes
+
+- **Fixed .NET 9 ASP.NET Blazor issues** — Resolved compatibility issues with .NET 9 ASP.NET Blazor applications. ([#3081](https://github.com/mono/SkiaSharp/pull/3081))
+- **Blazor WASM module loading fix** — Moved the Blazor workaround into the WASM layer for proper module loading. ([#3087](https://github.com/mono/SkiaSharp/pull/3087), [#3089](https://github.com/mono/SkiaSharp/pull/3089))
+- **Fixed import for apps with a base path** — Resolved WASM import issues for Blazor apps hosted at a sub-path. ([#3093](https://github.com/mono/SkiaSharp/pull/3093))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🪟 Windows | SDK version packaging fix |
+| 🌐 WebAssembly | Multi-thread and SIMD support, .NET 9 Blazor fixes, base path import fix |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@Redth](https://github.com/Redth) | Updated the Skia engine |
+| [@alexandrvslv](https://github.com/alexandrvslv) | Added Span overloads for SKMatrix and SKPath |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.0.0-preview.5.4...v3.116.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/3.116.0)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/3.116.0)
+
+---
+
+## Preview 6 (November 6, 2024)
+
+Updated Skia engine, added Span-based overloads for SKMatrix and SKPath, and multi-thread/SIMD WebAssembly support.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.0.0-preview.5.4...v3.116.0-preview.6.1)
diff --git a/documentation/docfx/releases/3.116.1.md b/documentation/docfx/releases/3.116.1.md
new file mode 100644
index 00000000000..624de8e853b
--- /dev/null
+++ b/documentation/docfx/releases/3.116.1.md
@@ -0,0 +1,29 @@
+# Version 3.116.1
+
+> **Android 16KB page size compliance** · Released December 5, 2024 · [NuGet](https://www.nuget.org/packages/SkiaSharp/3.116.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v3.116.1)
+
+## Highlights
+
+A patch release that updates the Android NDK to r27c with 16KB page alignment, ensuring compatibility with Android 15+ memory page size requirements, and fixes a NuGet package path attribute.
+
+## Breaking Changes
+
+*None in this release.*
+
+## Bug Fixes
+
+- **Android NDK updated to r27c with 16KB alignment** — Updated the Android NDK and enabled 16KB page alignment to comply with Android 15+ requirements. ([#3098](https://github.com/mono/SkiaSharp/pull/3098))
+- **Corrected NuGet PackagePath attribute** — Fixed the `PackagePath` attribute in NuGet packaging. ([#3102](https://github.com/mono/SkiaSharp/pull/3102))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🤖 Android | NDK r27c with 16KB page alignment |
+| 📦 General | NuGet packaging fix |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.116.0...v3.116.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/3.116.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/3.116.1)
diff --git a/documentation/docfx/releases/3.118.0.md b/documentation/docfx/releases/3.118.0.md
new file mode 100644
index 00000000000..0c63bdd23ae
--- /dev/null
+++ b/documentation/docfx/releases/3.118.0.md
@@ -0,0 +1,70 @@
+# Version 3.118.0
+
+> **Skia engine update and dependency refresh** · Preview only · [NuGet](https://www.nuget.org/packages/SkiaSharp/3.118.0-preview.2.3) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v3.118.0-preview.2.3)
+
+## Highlights
+
+SkiaSharp 3.118.0 updates the Skia engine through milestones 117 and 118, refreshes four native dependencies with security and stability fixes, and extends the Metal GPU API to all Apple platforms. Blazor WebAssembly gets several compatibility fixes for .NET 9 and base path configurations. Community contributor [@spouliot](https://github.com/spouliot) contributed the Metal API expansion.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Engine
+
+- **Skia milestone 117** — Updated the Skia engine to Chrome milestone 117. ([#3047](https://github.com/mono/SkiaSharp/pull/3047))
+- **Skia milestone 118** — Further updated to Chrome milestone 118 with additional rendering improvements. ([#3048](https://github.com/mono/SkiaSharp/pull/3048))
+
+### GPU & Rendering
+
+- **Metal API on all Apple platforms** — `GRBackendRenderTarget` Metal API is now available on iOS, macOS, tvOS, and Mac Catalyst — not just macOS. ❤️ [@spouliot](https://github.com/spouliot) ([#3070](https://github.com/mono/SkiaSharp/pull/3070))
+
+### Security & Dependencies
+
+- **libexpat updated to 2.6.4** — Picks up upstream security fixes. ([#3056](https://github.com/mono/SkiaSharp/pull/3056))
+- **freetype2 updated to 2.13.3+** — Latest stable with security and rendering fixes. ([#3061](https://github.com/mono/SkiaSharp/pull/3061))
+- **libjpeg-turbo updated to 2.1.5.1+** — Latest maintenance commits. ([#3060](https://github.com/mono/SkiaSharp/pull/3060))
+- **HarfBuzz updated to 8.3.1** — Text shaping engine update. ([#3052](https://github.com/mono/SkiaSharp/pull/3052))
+
+## Bug Fixes
+
+- **Fixed .NET 9 Blazor compatibility** — Resolved issues with ASP.NET Blazor on .NET 9. ([#3064](https://github.com/mono/SkiaSharp/pull/3064))
+- **Fixed Blazor base path imports** — Apps with a custom base path now load correctly. ([#3092](https://github.com/mono/SkiaSharp/pull/3092))
+- **Moved WASM workaround into SkiaSharp** — Blazor-specific fix relocated for broader compatibility. ([#3082](https://github.com/mono/SkiaSharp/pull/3082), [#3088](https://github.com/mono/SkiaSharp/pull/3088))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | Metal API for `GRBackendRenderTarget` on all Apple platforms |
+| 🌐 WebAssembly | .NET 9 Blazor fixes, base path import fix |
+| 🤖 Android | NDK updated to r27c with 16KB page alignment |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@spouliot](https://github.com/spouliot) | Added Metal API for `GRBackendRenderTarget` on all Apple platforms |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.116.0-preview.6.1...v3.118.0-preview.2.3)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/3.118.0-preview.2.3)
+
+---
+
+## Preview 2 (December 5, 2024)
+
+Dependency updates (libexpat, freetype, libjpeg-turbo), Metal API on all Apple platforms, .NET 9 Blazor fixes, and Android NDK r27c update.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.118.0-preview.1.2...v3.118.0-preview.2.3)
+
+---
+
+## Preview 1 (November 6, 2024)
+
+Initial preview with Skia m117 and m118 engine updates, plus HarfBuzz 8.3.1.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.116.0-preview.6.1...v3.118.0-preview.1.2)
diff --git a/documentation/docfx/releases/3.119.0.md b/documentation/docfx/releases/3.119.0.md
new file mode 100644
index 00000000000..35a8b0349a3
--- /dev/null
+++ b/documentation/docfx/releases/3.119.0.md
@@ -0,0 +1,88 @@
+# Version 3.119.0
+
+> **Major milestone release** · Released April 29, 2025 · [NuGet](https://www.nuget.org/packages/SkiaSharp/3.119.0) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v3.119.0)
+
+## Highlights
+
+SkiaSharp 3.119.0 is the first release built on **Skia milestone 119**, bringing the latest upstream rendering improvements. This release dramatically expands platform reach with new Direct3D support on Windows, GL on Windows ARM, tvOS Metal views, and first-ever RISC-V 64 and LoongArch64 Linux builds — plus Alpine Linux support. Six community contributors drove the majority of platform and API additions.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Engine
+
+- **Bump Skia to milestone 119** — Upgrades the underlying Skia graphics engine to Chrome milestone 119, bringing rendering improvements and new internal capabilities. ([#3062](https://github.com/mono/SkiaSharp/pull/3062))
+
+### GPU & Rendering
+
+- **Direct3D backend on Windows** — Compiles Skia with Direct3D support on Windows, enabling D3D-based GPU rendering. ❤️ [@Kation](https://github.com/Kation) ([#2823](https://github.com/mono/SkiaSharp/pull/2823))
+- **GL on Windows ARM** — Enables OpenGL rendering on Windows ARM64 devices. ([#3189](https://github.com/mono/SkiaSharp/pull/3189))
+
+### API Surface
+
+- **Missing SKColorFilter types** — Adds previously missing color filter types to the C# API surface. ([#2882](https://github.com/mono/SkiaSharp/pull/2882))
+- **SkCanvas::SaveLayerRec** — Exposes the `SaveLayerRec` API for advanced canvas save-layer control. ❤️ [@ahmed605](https://github.com/ahmed605) ([#2962](https://github.com/mono/SkiaSharp/pull/2962))
+
+### Platform
+
+- **tvOS Metal support** — Adds `SKMetalView` support on tvOS, completing Apple platform GPU coverage. ❤️ [@MartinZikmund](https://github.com/MartinZikmund) ([#3114](https://github.com/mono/SkiaSharp/pull/3114))
+- **RISC-V 64 Linux builds** — Adds native build support for the riscv64 architecture. ❤️ [@kasperk81](https://github.com/kasperk81) ([#3192](https://github.com/mono/SkiaSharp/pull/3192))
+- **LoongArch64 Linux builds** — Adds native build support for the LoongArch64 architecture. ❤️ [@4Darmygeometry](https://github.com/4Darmygeometry) ([#3198](https://github.com/mono/SkiaSharp/pull/3198))
+- **Alpine Linux support** — Extends the clang-cross toolchain to support Alpine (musl libc). ❤️ [@kasperk81](https://github.com/kasperk81) ([#3200](https://github.com/mono/SkiaSharp/pull/3200))
+
+### Security
+
+- **Android NDK updated to r27c** — Updates to NDK r27c with 16KB page alignment for modern Android devices. ([#3096](https://github.com/mono/SkiaSharp/pull/3096))
+- **Address CVE-2024-30105** — Security fix in build dependencies. ❤️ [@pjcollins](https://github.com/pjcollins) ([#3166](https://github.com/mono/SkiaSharp/pull/3166))
+- **Update libpng to 1.6.44** — Bumps libpng for security and stability improvements. ([#3059](https://github.com/mono/SkiaSharp/pull/3059))
+
+## Bug Fixes
+
+- **Fix SKImage.FromPicture implementation** — Corrects the image-from-picture creation path. ([#3231](https://github.com/mono/SkiaSharp/pull/3231))
+- **Fix incorrect SafeRef call** — Fixes an incorrect method call in the safe reference wrapper. ❤️ [@kkwpsv](https://github.com/kkwpsv) ([#3143](https://github.com/mono/SkiaSharp/pull/3143))
+- **Fix iOS Simulator Metal performance** — Resolves a performance regression when using Metal in the iOS Simulator. ❤️ [@taublast](https://github.com/taublast) ([#3156](https://github.com/mono/SkiaSharp/pull/3156))
+- **Fix .NET Framework/Mono packages.config regression** — Fixes a regression that broke projects using .NET Framework or Mono with packages.config. ❤️ [@sungaila](https://github.com/sungaila) ([#3112](https://github.com/mono/SkiaSharp/pull/3112))
+- **Increase Linux support** — Broadens compatibility across Linux distributions. ([#3209](https://github.com/mono/SkiaSharp/pull/3209))
+
+Plus several CI and build system improvements.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | tvOS Metal views, iOS Simulator Metal performance fix |
+| 🪟 Windows | Direct3D backend, GL on ARM64 |
+| 🐧 Linux | RISC-V 64, LoongArch64, Alpine support, broader compatibility |
+| 🤖 Android | NDK r27c with 16KB page alignment |
+| 🎨 Core API | Skia m119, SKColorFilter types, SaveLayerRec |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@MartinZikmund](https://github.com/MartinZikmund) | Added tvOS `SKMetalView` support |
+| [@ahmed605](https://github.com/ahmed605) | Implemented `SkCanvas::SaveLayerRec` |
+| [@Kation](https://github.com/Kation) | Added Direct3D compilation on Windows |
+| [@kasperk81](https://github.com/kasperk81) | Added RISC-V 64 builds and Alpine Linux support |
+| [@4Darmygeometry](https://github.com/4Darmygeometry) | Added LoongArch64 build support |
+| [@kkwpsv](https://github.com/kkwpsv) | Fixed incorrect SafeRef call |
+| [@taublast](https://github.com/taublast) | Fixed iOS Simulator Metal performance |
+| [@sungaila](https://github.com/sungaila) | Fixed .NET Framework/Mono packages.config regression |
+| [@pjcollins](https://github.com/pjcollins) | Addressed CVE-2024-30105 |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.118.0-preview.2.3...v3.119.0)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/3.119.0)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/3.119.0)
+
+---
+
+## Preview 1 (April 1, 2025)
+
+Skia milestone 119 upgrade with Direct3D on Windows, tvOS Metal support, SaveLayerRec API, RISC-V 64 / LoongArch64 / Alpine Linux builds, and numerous bug fixes.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.118.0-preview.2.3...v3.119.0-preview.1.1)
diff --git a/documentation/docfx/releases/3.119.1.md b/documentation/docfx/releases/3.119.1.md
new file mode 100644
index 00000000000..f678fa1aba0
--- /dev/null
+++ b/documentation/docfx/releases/3.119.1.md
@@ -0,0 +1,67 @@
+# Version 3.119.1
+
+> **Stability and platform fixes** · Released September 23, 2025 · [NuGet](https://www.nuget.org/packages/SkiaSharp/3.119.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v3.119.1)
+
+## Highlights
+
+SkiaSharp 3.119.1 focuses on stability and platform compatibility. Key fixes include preventing double initialization of `SKMetalView`, a crash guard for `SKAutoCanvasRestore`, Metal compatibility for iOS 15 and earlier, correct PDF metadata date handling, and properly loading EGL/GLESv2 in unpackaged WinUI apps. The new `PostScriptName` property on `SKTypeface` rounds out the release. Five community contributors drove the critical fixes.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Text & Fonts
+
+- **PostScriptName on SKTypeface** — Exposes the PostScript name for font identification workflows. ❤️ [@jonlipsky](https://github.com/jonlipsky) ([#3263](https://github.com/mono/SkiaSharp/pull/3263))
+
+### Platform
+
+- **Fix unpackaged WinUI loading** — Builds EGL as Win32 and GLESv2 as WASDK to resolve native library loading failures in unpackaged WinUI 3 apps. ([#3338](https://github.com/mono/SkiaSharp/pull/3338))
+- **WinUI Interop built as /MT** — Statically links the C runtime in the WinUI interop DLL, eliminating external CRT dependencies. ([#3341](https://github.com/mono/SkiaSharp/pull/3341))
+
+### Security
+
+- **Update zlib to v1.3.0.1+** — Bumps zlib for security and stability improvements. ([#3058](https://github.com/mono/SkiaSharp/pull/3058))
+
+## Bug Fixes
+
+- **Avoid double-initializing SKMetalView** — Prevents a crash when `SKMetalView` is initialized more than once. ❤️ [@jeremy-visionaid](https://github.com/jeremy-visionaid) ([#3256](https://github.com/mono/SkiaSharp/pull/3256))
+- **SKAutoCanvasRestore crash guard** — Prevents a crash when `Dispose` is called after the canvas has already been disposed. ❤️ [@taublast](https://github.com/taublast) ([#3291](https://github.com/mono/SkiaSharp/pull/3291))
+- **SKXamlCanvas opaque fix on Mac Catalyst** — Ensures `SKXamlCanvas` is not forced opaque on Mac Catalyst, fixing transparency. ❤️ [@spouliot](https://github.com/spouliot) ([#3236](https://github.com/mono/SkiaSharp/pull/3236))
+- **Metal hotfix for iOS 15 and lower** — Fixes Metal rendering compatibility on devices running iOS 15 or earlier. ❤️ [@taublast](https://github.com/taublast) ([#3293](https://github.com/mono/SkiaSharp/pull/3293))
+- **Fix UTC DateTime conversion for PDF metadata** — Corrects the date-time conversion in `SKDocumentPdfMetadata` so timestamps are stored accurately. ❤️ [@jeremy-visionaid](https://github.com/jeremy-visionaid) ([#3333](https://github.com/mono/SkiaSharp/pull/3333))
+
+Plus several CI and pipeline improvements.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | Metal hotfix for iOS 15, SKXamlCanvas transparency on Mac Catalyst |
+| 🪟 Windows | WinUI unpackaged loading fix, WinUI /MT interop |
+| 🎨 Core API | `PostScriptName` on SKTypeface, SKAutoCanvasRestore crash guard |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@jeremy-visionaid](https://github.com/jeremy-visionaid) | Fixed double-init SKMetalView, fixed PDF metadata DateTime |
+| [@taublast](https://github.com/taublast) | SKAutoCanvasRestore crash guard, Metal hotfix for iOS 15 |
+| [@spouliot](https://github.com/spouliot) | Fixed SKXamlCanvas opacity on Mac Catalyst |
+| [@jonlipsky](https://github.com/jonlipsky) | Added PostScriptName to SKTypeface |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.0...v3.119.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/3.119.1)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/3.119.1)
+
+---
+
+## Preview 1 (September 8, 2025)
+
+Stability fixes for Metal on Apple platforms, WinUI loading improvements, PDF metadata DateTime fix, and new PostScriptName API on SKTypeface.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.0...v3.119.1-preview.1.1)
diff --git a/documentation/docfx/releases/3.119.2.md b/documentation/docfx/releases/3.119.2.md
new file mode 100644
index 00000000000..9443153993c
--- /dev/null
+++ b/documentation/docfx/releases/3.119.2.md
@@ -0,0 +1,70 @@
+# Version 3.119.2
+
+> **Security hardening release** · Released February 7, 2026 · [NuGet](https://www.nuget.org/packages/SkiaSharp/3.119.2) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v3.119.2)
+
+## Highlights
+
+This release focuses on hardening the native libraries against common exploit techniques on Windows and Linux. Spectre mitigations, Control Flow Guard, and BufferSecurityCheck are now enabled across all Windows and Linux native builds. Three community contributors drove every user-facing change in this release.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Platform
+
+- **tvOS `SKSurface.Create` overloads** — Adds the missing overloads for tvOS, bringing parity with other Apple platforms. ❤️ [@MartinZikmund](https://github.com/MartinZikmund) ([#3342](https://github.com/mono/SkiaSharp/pull/3342))
+
+## Security
+
+- **Spectre mitigation for Windows** — Enables `/Qspectre` for `libSkiaSharp.dll`. ❤️ [@sshumakov](https://github.com/sshumakov) ([#3496](https://github.com/mono/SkiaSharp/pull/3496), [#3497](https://github.com/mono/SkiaSharp/pull/3497))
+- **Spectre mitigation for Linux** — Enables Spectre v1 mitigations for `libSkiaSharp.so`. ❤️ [@sshumakov](https://github.com/sshumakov) ([#3502](https://github.com/mono/SkiaSharp/pull/3502), [#3503](https://github.com/mono/SkiaSharp/pull/3503))
+- **Control Flow Guard (CFG)** — Enables CFG for all Windows native DLLs. ❤️ [@Aguilex](https://github.com/Aguilex) ([#3397](https://github.com/mono/SkiaSharp/pull/3397))
+- **BufferSecurityCheck** — Enables `/GS` buffer security checks to resolve BinSkim BA2007. ❤️ [@Aguilex](https://github.com/Aguilex) ([#3404](https://github.com/mono/SkiaSharp/pull/3404))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | tvOS `SKSurface.Create` overloads |
+| 🪟 Windows | Spectre mitigation, Control Flow Guard, BufferSecurityCheck |
+| 🐧 Linux | Spectre mitigation |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@MartinZikmund](https://github.com/MartinZikmund) | Added missing tvOS `SKSurface.Create` overloads |
+| [@sshumakov](https://github.com/sshumakov) | Added Spectre mitigations for Windows and Linux |
+| [@Aguilex](https://github.com/Aguilex) | Enabled Control Flow Guard and BufferSecurityCheck on Windows |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.1...v3.119.2)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/3.119.2)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/3.119.2)
+
+---
+
+## Preview 3 (February 5, 2026)
+
+Added Spectre mitigation for Windows native libraries.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.2-preview.2.3...v3.119.2-preview.3.1)
+
+---
+
+## Preview 2 (January 26, 2026)
+
+Enabled Control Flow Guard and BufferSecurityCheck for Windows native DLLs.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.2-preview.1.2...v3.119.2-preview.2.3)
+
+---
+
+## Preview 1 (January 26, 2026)
+
+Added missing tvOS `SKSurface.Create` overloads, plus build system improvements.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.1...v3.119.2-preview.1.2)
diff --git a/documentation/docfx/releases/3.119.3.md b/documentation/docfx/releases/3.119.3.md
new file mode 100644
index 00000000000..6c4803991d2
--- /dev/null
+++ b/documentation/docfx/releases/3.119.3.md
@@ -0,0 +1,60 @@
+# Version 3.119.3
+
+> **Security updates and native fixes** · Preview only · [NuGet](https://www.nuget.org/packages/SkiaSharp/3.119.3-preview.1.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v3.119.3-preview.1.1)
+
+## Highlights
+
+SkiaSharp 3.119.3 delivers a sweep of native dependency security updates — libpng, libexpat, brotli, and libwebp are all bumped to their latest versions. Spectre mitigations are carried forward for both Windows and Linux builds. A fix for AoT crashes when `IlcDisableReflection=true` improves NativeAOT compatibility, and a Linux ARM64 fontconfig fix resolves cross-compilation crashes.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Security
+
+- **Update libpng to 1.6.54** — Bumps libpng for latest security and bug fixes. ([#3452](https://github.com/mono/SkiaSharp/pull/3452))
+- **Bump libexpat from 2.6.4 to 2.7.3** — Addresses known CVEs in the XML parsing library. ([#3458](https://github.com/mono/SkiaSharp/pull/3458))
+- **Update brotli to 1.2.0** — Upgrades the compression library to the latest release. ([#3469](https://github.com/mono/SkiaSharp/pull/3469))
+- **Update libwebp to 1.6.0** — Upgrades WebP encoding/decoding to the latest release. ([#3478](https://github.com/mono/SkiaSharp/pull/3478))
+- **Spectre mitigation for Windows** — Enables `/Qspectre` for `libSkiaSharp.dll`. ❤️ [@sshumakov](https://github.com/sshumakov) ([#3496](https://github.com/mono/SkiaSharp/pull/3496))
+- **Spectre mitigation for Linux** — Enables Spectre v1 mitigations for `libSkiaSharp.so`. ❤️ [@sshumakov](https://github.com/sshumakov) ([#3502](https://github.com/mono/SkiaSharp/pull/3502))
+
+### API Surface
+
+- **Fix AoT crash when IlcDisableReflection=true** — Resolves a crash in NativeAOT deployments that disable reflection. ([#3485](https://github.com/mono/SkiaSharp/pull/3485))
+
+## Bug Fixes
+
+- **Fix Linux ARM64 cross-compile crash** — Adds missing fontconfig to the cross-compile sysroot, fixing crashes on Linux ARM64. ([#3494](https://github.com/mono/SkiaSharp/pull/3494))
+
+Plus several CI, documentation, and skill improvements.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🪟 Windows | Spectre mitigation |
+| 🐧 Linux | Spectre mitigation, ARM64 fontconfig fix |
+| 🎨 Core API | NativeAOT IlcDisableReflection fix |
+| 📦 General | libpng 1.6.54, libexpat 2.7.3, brotli 1.2.0, libwebp 1.6.0 |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@sshumakov](https://github.com/sshumakov) | Added Spectre mitigations for Windows and Linux |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.2...v3.119.3-preview.1.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/3.119.3-preview.1.1)
+
+---
+
+## Preview 1 (February 11, 2026)
+
+Security dependency sweep (libpng, libexpat, brotli, libwebp), Spectre mitigations, NativeAOT IlcDisableReflection fix, and Linux ARM64 fontconfig crash fix.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.2...v3.119.3-preview.1.1)
diff --git a/documentation/docfx/releases/3.119.4.md b/documentation/docfx/releases/3.119.4.md
new file mode 100644
index 00000000000..5f63e6162ba
--- /dev/null
+++ b/documentation/docfx/releases/3.119.4.md
@@ -0,0 +1,72 @@
+# Version 3.119.4
+
+> **Platform expansion release** · Preview only · [NuGet](https://www.nuget.org/packages/SkiaSharp/3.119.4-preview.1.1) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v3.119.4-preview.1.1)
+
+## Highlights
+
+SkiaSharp 3.119.4 is a major platform expansion release. GTK 4 gets first-class support via the new `SkiaSharp.Views.Gtk4` package, Tizen gains x64 and ARM64 native builds, and Linux Bionic native assets are now included. On Windows, D3D12 DLLs are delay-loaded to prevent crashes on systems without DirectX 12, and the interactive Blazor WASM Gallery showcase debuts with 21 demos. The SDK moves to .NET 10, and `SKManagedStream` receives a significant internal refactor.
+
+## Breaking Changes
+
+*None in this release.*
+
+## New Features
+
+### Platform
+
+- **SkiaSharp.Views.Gtk4** — Adds a new GTK 4 view package using GirCore.Gtk-4.0 bindings, enabling SkiaSharp rendering in modern GTK 4 apps. ([#3527](https://github.com/mono/SkiaSharp/pull/3527))
+- **Linux Bionic native assets** — Adds native library support for the Linux Bionic (Android-like) platform. ❤️ [@4Darmygeometry](https://github.com/4Darmygeometry) ([#3217](https://github.com/mono/SkiaSharp/pull/3217))
+- **Tizen x64 and ARM64 builds** — Adds native build support for Tizen on x64 and arm64 architectures. ([#3620](https://github.com/mono/SkiaSharp/pull/3620))
+- **Delay-load D3D12 DLLs** — Prevents crashes on Windows systems without DirectX 12 by delay-loading D3D12 dependencies. ([#3633](https://github.com/mono/SkiaSharp/pull/3633))
+- **Update to .NET 10 SDK** — Moves the build to .NET 10 with workload version set pinning. ([#3514](https://github.com/mono/SkiaSharp/pull/3514))
+
+### API Surface
+
+- **SKManagedStream refactor** — Replaces the parent/child chain in `SKManagedStream` with a `SKData` snapshot for duplicate/fork operations, improving reliability. ([#3589](https://github.com/mono/SkiaSharp/pull/3589))
+- **PolySharp for C# 13 on legacy TFMs** — Enables modern C# 13 language features on older target frameworks via PolySharp polyfills. ❤️ [@4Darmygeometry](https://github.com/4Darmygeometry) ([#3642](https://github.com/mono/SkiaSharp/pull/3642))
+
+### GPU & Rendering
+
+- **Interactive Blazor WASM Gallery** — Redesigns the sample gallery as an interactive Blazor WebAssembly showcase with 21 rendering demos. ([#3578](https://github.com/mono/SkiaSharp/pull/3578))
+
+## Bug Fixes
+
+- **Fix SKGLView not rendering after tab switch** — Resolves a MAUI bug where `SKGLView` stopped rendering after switching tabs in a `TabBar`. ❤️ [@SimonvBez](https://github.com/SimonvBez) ([#3076](https://github.com/mono/SkiaSharp/pull/3076))
+- **Fix tvOS device/simulator split** — Splits tvOS native builds into separate device and simulator targets to match the iOS pattern. ([#3561](https://github.com/mono/SkiaSharp/pull/3561), [#3563](https://github.com/mono/SkiaSharp/pull/3563))
+- **Fix Cairo assertion crash in GTK4** — Resolves a Cairo assertion failure in the GTK4 `SKDrawingArea`. ([#3562](https://github.com/mono/SkiaSharp/pull/3562))
+- **Fix loongarch64 Linux build mapping** — Corrects the architecture mapping for LoongArch64 builds. ([#3648](https://github.com/mono/SkiaSharp/pull/3648))
+- **Update FullFrameworkTargetFrameworks to net48** — Raises the minimum .NET Framework target to 4.8. ❤️ [@4Darmygeometry](https://github.com/4Darmygeometry) ([#3631](https://github.com/mono/SkiaSharp/pull/3631))
+- **Enforce `--no-undefined` linker flag** — Adds the `-Wl,--no-undefined` flag for Linux and Android native builds to catch missing symbols at link time. ([#3629](https://github.com/mono/SkiaSharp/pull/3629))
+
+Plus extensive sample updates across all platforms, CI improvements, and documentation enhancements.
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | tvOS device/simulator build split |
+| 🪟 Windows | D3D12 delay-loading, MSIX WinUI sample |
+| 🐧 Linux | GTK 4 views, Bionic assets, LoongArch64 fix, Cairo crash fix |
+| 🤖 Android | SKGLView tab switch fix in MAUI |
+| 🌐 WebAssembly | Interactive Blazor Gallery with 21 demos |
+| 📦 General | .NET 10 SDK, Tizen x64/ARM64, PolySharp C# 13 |
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@4Darmygeometry](https://github.com/4Darmygeometry) | Linux Bionic assets, PolySharp C# 13 support, net48 target update |
+| [@SimonvBez](https://github.com/SimonvBez) | Fixed SKGLView rendering after MAUI tab switch |
+
+## Links
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.3-preview.1.1...v3.119.4-preview.1.1)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/3.119.4-preview.1.1)
+
+---
+
+## Preview 1 (April 23, 2026)
+
+GTK 4 views, Linux Bionic assets, Tizen builds, D3D12 delay-loading, Blazor WASM Gallery, .NET 10 SDK, SKManagedStream refactor, and MAUI tab switch rendering fix.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.3-preview.1.1...v3.119.4-preview.1.1)
diff --git a/documentation/docfx/releases/4.133.0.md b/documentation/docfx/releases/4.133.0.md
new file mode 100644
index 00000000000..269a4685f39
--- /dev/null
+++ b/documentation/docfx/releases/4.133.0.md
@@ -0,0 +1,65 @@
+# Version 4.133.0
+
+> **Upcoming release** · In development · Not yet available on NuGet
+
+## Highlights
+
+SkiaSharp 4.133.0 is the first major version bump to 4.x, powered by Skia m133. This release introduces full variable font support with color font palettes, new platform targets for Android Bionic and Tizen, sampling options for surface drawing, and updated native dependencies. Community contributors [@ramezgerges](https://github.com/ramezgerges), [@4Darmygeometry](https://github.com/4Darmygeometry), and [@SimonvBez](https://github.com/SimonvBez) drove key features and fixes across the release.
+
+## ⚠️ Breaking Changes
+
+- **Major version upgrade to 4.x** — SkiaSharp moves from 3.x to 4.x with updated APIs and Skia engine alignment. ([#3640](https://github.com/mono/SkiaSharp/pull/3640))
+
+## New Features
+
+### Engine
+
+- **Skia m132** — Bumps the Skia engine to Chrome milestone 132. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#3560](https://github.com/mono/SkiaSharp/pull/3560))
+- **Skia m133** — Bumps the Skia engine to Chrome milestone 133, bringing the latest upstream rendering and performance improvements. ([#3660](https://github.com/mono/SkiaSharp/pull/3660))
+
+### Text & Fonts
+
+- **Variable font support** — Full OpenType variable font axis support, enabling weight, width, slant, and custom axis control at runtime. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#3703](https://github.com/mono/SkiaSharp/pull/3703))
+- **Color font palette support** — Adds color palette APIs for COLRv1 and multi-palette color fonts, plus improved variable font robustness. ([#3742](https://github.com/mono/SkiaSharp/pull/3742))
+- **Default typeface resolution moved to managed layer** — Resolves typeface fallback in C# for more predictable cross-platform behavior. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#3730](https://github.com/mono/SkiaSharp/pull/3730))
+
+### API Surface
+
+- **`SKSamplingOptions` for surface drawing** — Adds sampling options to `SKSurface.Draw` and `SKCanvas.DrawSurface`, enabling control over filtering when drawing surfaces. ([#3491](https://github.com/mono/SkiaSharp/pull/3491))
+
+### Platform
+
+- **Android Bionic Library build support** — Enables building native SkiaSharp for Android using the Bionic C library directly. ❤️ [@4Darmygeometry](https://github.com/4Darmygeometry) ([#3217](https://github.com/mono/SkiaSharp/pull/3217))
+- **Tizen x64 and arm64 native builds** — Adds native build support for Tizen on x64 and arm64 architectures. ([#3620](https://github.com/mono/SkiaSharp/pull/3620))
+- **C# 13 support on legacy TFMs** — Adds PolySharp to enable C# 13 language features across all target frameworks. ❤️ [@4Darmygeometry](https://github.com/4Darmygeometry) ([#3642](https://github.com/mono/SkiaSharp/pull/3642))
+- **SkiaSharpGenerator works on Linux** — Upgrades CppAst to 0.21.4 and fixes Linux compatibility for the binding generator. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#3714](https://github.com/mono/SkiaSharp/pull/3714))
+
+## Security
+
+- **libpng updated to 1.6.58** — Picks up the latest security and stability fixes. ([#3718](https://github.com/mono/SkiaSharp/pull/3718))
+- **libexpat updated to 2.7.5** — Picks up the latest security and stability fixes. ([#3717](https://github.com/mono/SkiaSharp/pull/3717))
+
+## Bug Fixes
+
+- **Fixed SKGLView on Android not rendering with TabBar** — Resolves an issue where `SKGLView` would not render when used inside a tab bar on Android. ❤️ [@SimonvBez](https://github.com/SimonvBez) ([#3076](https://github.com/mono/SkiaSharp/pull/3076))
+- **Fixed x86 .NET Framework threading test OOM failures** — Resolves out-of-memory crashes in threading tests on 32-bit .NET Framework. ([#3674](https://github.com/mono/SkiaSharp/pull/3674))
+- **Fixed Debian 13 Docker build** — Corrects native build failures for non-loong64/riscv64 architectures on Debian 13. ([#3747](https://github.com/mono/SkiaSharp/pull/3747))
+
+## Platform Support
+
+| Platform | What's New |
+|----------|-----------|
+| 🤖 Android | Bionic Library build support, SKGLView TabBar rendering fix |
+| 🐧 Linux | Debian 13 build fix, binding generator Linux support |
+| 📺 Tizen | x64 and arm64 native builds |
+| 🎨 Core API | Variable fonts, color palettes, sampling options, Skia m133 |
+
+Plus several CI, documentation, sample gallery, and workflow improvements.
+
+## Community Contributors ❤️
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@ramezgerges](https://github.com/ramezgerges) | Variable font support, Skia m132 bump, default-typeface resolution fix, SkiaSharpGenerator Linux support, Uno Platform WASM gallery sample |
+| [@4Darmygeometry](https://github.com/4Darmygeometry) | Android Bionic Library build support, PolySharp for C# 13 on legacy TFMs |
+| [@SimonvBez](https://github.com/SimonvBez) | Fixed SKGLView rendering with TabBar on Android |
diff --git a/documentation/docfx/releases/TEMPLATE.md b/documentation/docfx/releases/TEMPLATE.md
new file mode 100644
index 00000000000..ac645192a8e
--- /dev/null
+++ b/documentation/docfx/releases/TEMPLATE.md
@@ -0,0 +1,114 @@
+
+
+# Version 3.119.2
+
+> **Security hardening release** · Released February 7, 2026 · [NuGet](https://www.nuget.org/packages/SkiaSharp/3.119.2) · [GitHub Release](https://github.com/mono/SkiaSharp/releases/tag/v3.119.2)
+
+
+
+## Highlights
+
+
+
+This release focuses on hardening the native libraries against common exploit techniques on Windows and Linux. Spectre mitigations, Control Flow Guard, and BufferSecurityCheck are now enabled across all Windows and Linux native builds. Three community contributors drove every user-facing change in this release.
+
+## Breaking Changes
+
+
+
+*None in this release.*
+
+## New Features
+
+
+
+### Platform
+
+- **tvOS `SKSurface.Create` overloads** — Adds the missing overloads for tvOS, bringing parity with other Apple platforms. ❤️ [@MartinZikmund](https://github.com/MartinZikmund) ([#3342](https://github.com/mono/SkiaSharp/pull/3342))
+
+## Security
+
+
+
+- **Spectre mitigation for Windows** — Enables `/Qspectre` for `libSkiaSharp.dll`. ❤️ [@sshumakov](https://github.com/sshumakov) ([#3496](https://github.com/mono/SkiaSharp/pull/3496))
+- **Control Flow Guard (CFG)** — Enables CFG for all Windows native DLLs. ❤️ [@Aguilex](https://github.com/Aguilex) ([#3397](https://github.com/mono/SkiaSharp/pull/3397))
+
+## Bug Fixes
+
+
+
+- **Fixed the frobnitz crash** — Description of what was wrong and what the fix does. ([#NNN](https://github.com/mono/SkiaSharp/pull/NNN))
+
+## Platform Support
+
+
+
+| Platform | What's New |
+|----------|-----------|
+| 🍎 Apple | tvOS `SKSurface.Create` overloads |
+| 🪟 Windows | Spectre mitigation, Control Flow Guard |
+| 🐧 Linux | Spectre mitigation |
+
+
+
+## Community Contributors ❤️
+
+
+
+| Contributor | What They Did |
+|-------------|--------------|
+| [@MartinZikmund](https://github.com/MartinZikmund) | Added missing tvOS `SKSurface.Create` overloads |
+| [@Aguilex](https://github.com/Aguilex) | Enabled Control Flow Guard and BufferSecurityCheck on Windows |
+
+## Links
+
+
+
+- [Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.1...v3.119.2)
+- [NuGet Package](https://www.nuget.org/packages/SkiaSharp/3.119.2)
+- [API Diff](https://github.com/mono/SkiaSharp/tree/main/changelogs/SkiaSharp/3.119.2)
+
+---
+
+## Preview 3 (February 5, 2026)
+
+
+
+Added Spectre mitigation for Windows native libraries.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.2-preview.2.3...v3.119.2-preview.3.1)
+
+---
+
+## Preview 1 (January 26, 2026)
+
+Added missing tvOS `SKSurface.Create` overloads, plus build system improvements.
+
+[Full Changelog](https://github.com/mono/SkiaSharp/compare/v3.119.1...v3.119.2-preview.1.2)
+
+
diff --git a/documentation/docfx/releases/TOC.yml b/documentation/docfx/releases/TOC.yml
new file mode 100644
index 00000000000..3d188adf208
--- /dev/null
+++ b/documentation/docfx/releases/TOC.yml
@@ -0,0 +1,182 @@
+- name: Overview
+ href: index.md
+- name: Version 4.133.x
+ href: 4.133.0.md
+ items:
+ - name: Version 4.133.0
+ href: 4.133.0.md
+- name: Version 3.119.x
+ href: 3.119.4.md
+ items:
+ - name: Version 3.119.4
+ href: 3.119.4.md
+ - name: Version 3.119.3
+ href: 3.119.3.md
+ - name: Version 3.119.2
+ href: 3.119.2.md
+ - name: Version 3.119.1
+ href: 3.119.1.md
+ - name: Version 3.119.0
+ href: 3.119.0.md
+- name: Version 3.118.x
+ href: 3.118.0.md
+ items:
+ - name: Version 3.118.0
+ href: 3.118.0.md
+- name: Version 3.116.x
+ href: 3.116.1.md
+ items:
+ - name: Version 3.116.1
+ href: 3.116.1.md
+ - name: Version 3.116.0
+ href: 3.116.0.md
+- name: Version 3.0.x
+ href: 3.0.0.md
+ items:
+ - name: Version 3.0.0
+ href: 3.0.0.md
+- name: Obsolete Versions
+ href: 2.88.9.md
+ items:
+ - name: Version 2.88.x
+ href: 2.88.9.md
+ items:
+ - name: Version 2.88.9
+ href: 2.88.9.md
+ - name: Version 2.88.8
+ href: 2.88.8.md
+ - name: Version 2.88.7
+ href: 2.88.7.md
+ - name: Version 2.88.6
+ href: 2.88.6.md
+ - name: Version 2.88.5
+ href: 2.88.5.md
+ - name: Version 2.88.4
+ href: 2.88.4.md
+ - name: Version 2.88.3
+ href: 2.88.3.md
+ - name: Version 2.88.2
+ href: 2.88.2.md
+ - name: Version 2.88.1
+ href: 2.88.1.md
+ - name: Version 2.88.0
+ href: 2.88.0.md
+ - name: Version 2.80.x
+ href: 2.80.4.md
+ items:
+ - name: Version 2.80.4
+ href: 2.80.4.md
+ - name: Version 2.80.3
+ href: 2.80.3.md
+ - name: Version 2.80.2
+ href: 2.80.2.md
+ - name: Version 2.80.1
+ href: 2.80.1.md
+ - name: Version 2.80.0
+ href: 2.80.0.md
+ - name: Version 1.68.x
+ href: 1.68.3.md
+ items:
+ - name: Version 1.68.3
+ href: 1.68.3.md
+ - name: Version 1.68.2.1
+ href: 1.68.2.1.md
+ - name: Version 1.68.2
+ href: 1.68.2.md
+ - name: Version 1.68.1.1
+ href: 1.68.1.1.md
+ - name: Version 1.68.1
+ href: 1.68.1.md
+ - name: Version 1.68.0
+ href: 1.68.0.md
+ - name: Version 1.60.x
+ href: 1.60.3.md
+ items:
+ - name: Version 1.60.3
+ href: 1.60.3.md
+ - name: Version 1.60.2
+ href: 1.60.2.md
+ - name: Version 1.60.1
+ href: 1.60.1.md
+ - name: Version 1.60.0
+ href: 1.60.0.md
+ - name: Version 1.59.x
+ href: 1.59.3.md
+ items:
+ - name: Version 1.59.3
+ href: 1.59.3.md
+ - name: Version 1.59.2
+ href: 1.59.2.md
+ - name: Version 1.59.1.1
+ href: 1.59.1.1.md
+ - name: Version 1.59.1
+ href: 1.59.1.md
+ - name: Version 1.59.0
+ href: 1.59.0.md
+ - name: Version 1.58.x
+ href: 1.58.1.1.md
+ items:
+ - name: Version 1.58.1.1
+ href: 1.58.1.1.md
+ - name: Version 1.58.1
+ href: 1.58.1.md
+ - name: Version 1.58.0
+ href: 1.58.0.md
+ - name: Version 1.57.x
+ href: 1.57.1.md
+ items:
+ - name: Version 1.57.1
+ href: 1.57.1.md
+ - name: Version 1.57.0
+ href: 1.57.0.md
+ - name: Version 1.56.x
+ href: 1.56.2.md
+ items:
+ - name: Version 1.56.2
+ href: 1.56.2.md
+ - name: Version 1.56.1
+ href: 1.56.1.md
+ - name: Version 1.56.0
+ href: 1.56.0.md
+ - name: Version 1.55.x
+ href: 1.55.1.md
+ items:
+ - name: Version 1.55.1
+ href: 1.55.1.md
+ - name: Version 1.55.0
+ href: 1.55.0.md
+ - name: Version 1.54.x
+ href: 1.54.1.md
+ items:
+ - name: Version 1.54.1
+ href: 1.54.1.md
+ - name: Version 1.54.0
+ href: 1.54.0.md
+ - name: Version 1.53.x
+ href: 1.53.2.md
+ items:
+ - name: Version 1.53.2
+ href: 1.53.2.md
+ - name: Version 1.53.1.2
+ href: 1.53.1.2.md
+ - name: Version 1.53.1.1
+ href: 1.53.1.1.md
+ - name: Version 1.53.1
+ href: 1.53.1.md
+ - name: Version 1.53.0
+ href: 1.53.0.md
+ - name: Version 1.49.x
+ href: 1.49.4.md
+ items:
+ - name: Version 1.49.4
+ href: 1.49.4.md
+ - name: Version 1.49.3
+ href: 1.49.3.md
+ - name: Version 1.49.2.1
+ href: 1.49.2.1.md
+ - name: Version 1.49.2
+ href: 1.49.2.md
+ - name: Version 1.49.1
+ href: 1.49.1.md
+ - name: Version 1.49.0
+ href: 1.49.0.md
diff --git a/documentation/docfx/releases/index.md b/documentation/docfx/releases/index.md
new file mode 100644
index 00000000000..70d685a37d2
--- /dev/null
+++ b/documentation/docfx/releases/index.md
@@ -0,0 +1,95 @@
+# Release Notes
+
+Release notes for all SkiaSharp versions.
+
+### SkiaSharp 4.x
+
+- **Version 4.133.x**
+ - [Version 4.133.0 (Upcoming)](4.133.0.md)
+
+### SkiaSharp 3.x
+
+- **Version 3.119.x**
+ - [Version 3.119.4](3.119.4.md)
+ - [Version 3.119.3](3.119.3.md)
+ - [Version 3.119.2](3.119.2.md)
+ - [Version 3.119.1](3.119.1.md)
+ - [Version 3.119.0](3.119.0.md)
+- **Version 3.118.x**
+ - [Version 3.118.0](3.118.0.md)
+- **Version 3.116.x**
+ - [Version 3.116.1](3.116.1.md)
+ - [Version 3.116.0](3.116.0.md)
+- **Version 3.0.x**
+ - [Version 3.0.0](3.0.0.md)
+
+### SkiaSharp 2.x
+
+- **Version 2.88.x**
+ - [Version 2.88.9](2.88.9.md)
+ - [Version 2.88.8](2.88.8.md)
+ - [Version 2.88.7](2.88.7.md)
+ - [Version 2.88.6](2.88.6.md)
+ - [Version 2.88.5](2.88.5.md)
+ - [Version 2.88.4](2.88.4.md)
+ - [Version 2.88.3](2.88.3.md)
+ - [Version 2.88.2](2.88.2.md)
+ - [Version 2.88.1](2.88.1.md)
+ - [Version 2.88.0](2.88.0.md)
+- **Version 2.80.x**
+ - [Version 2.80.4](2.80.4.md)
+ - [Version 2.80.3](2.80.3.md)
+ - [Version 2.80.2](2.80.2.md)
+ - [Version 2.80.1](2.80.1.md)
+ - [Version 2.80.0](2.80.0.md)
+
+### SkiaSharp 1.x
+
+- **Version 1.68.x**
+ - [Version 1.68.3](1.68.3.md)
+ - [Version 1.68.2.1](1.68.2.1.md)
+ - [Version 1.68.2](1.68.2.md)
+ - [Version 1.68.1.1](1.68.1.1.md)
+ - [Version 1.68.1](1.68.1.md)
+ - [Version 1.68.0](1.68.0.md)
+- **Version 1.60.x**
+ - [Version 1.60.3](1.60.3.md)
+ - [Version 1.60.2](1.60.2.md)
+ - [Version 1.60.1](1.60.1.md)
+ - [Version 1.60.0](1.60.0.md)
+- **Version 1.59.x**
+ - [Version 1.59.3](1.59.3.md)
+ - [Version 1.59.2](1.59.2.md)
+ - [Version 1.59.1.1](1.59.1.1.md)
+ - [Version 1.59.1](1.59.1.md)
+ - [Version 1.59.0](1.59.0.md)
+- **Version 1.58.x**
+ - [Version 1.58.1.1](1.58.1.1.md)
+ - [Version 1.58.1](1.58.1.md)
+ - [Version 1.58.0](1.58.0.md)
+- **Version 1.57.x**
+ - [Version 1.57.1](1.57.1.md)
+ - [Version 1.57.0](1.57.0.md)
+- **Version 1.56.x**
+ - [Version 1.56.2](1.56.2.md)
+ - [Version 1.56.1](1.56.1.md)
+ - [Version 1.56.0](1.56.0.md)
+- **Version 1.55.x**
+ - [Version 1.55.1](1.55.1.md)
+ - [Version 1.55.0](1.55.0.md)
+- **Version 1.54.x**
+ - [Version 1.54.1](1.54.1.md)
+ - [Version 1.54.0](1.54.0.md)
+- **Version 1.53.x**
+ - [Version 1.53.2](1.53.2.md)
+ - [Version 1.53.1.2](1.53.1.2.md)
+ - [Version 1.53.1.1](1.53.1.1.md)
+ - [Version 1.53.1](1.53.1.md)
+ - [Version 1.53.0](1.53.0.md)
+- **Version 1.49.x**
+ - [Version 1.49.4](1.49.4.md)
+ - [Version 1.49.3](1.49.3.md)
+ - [Version 1.49.2.1](1.49.2.1.md)
+ - [Version 1.49.2](1.49.2.md)
+ - [Version 1.49.1](1.49.1.md)
+ - [Version 1.49.0](1.49.0.md)
diff --git a/documentation/site/index.html b/documentation/site/index.html
index ea95efff4d2..f7a797fee38 100644
--- a/documentation/site/index.html
+++ b/documentation/site/index.html
@@ -17,6 +17,7 @@
SkiaSharp