Skip to content

Commit 26aa610

Browse files
authored
Merge pull request #43 from link-foundation/issue-39-2bdad3e8ff81
Add clickable links for all Docker image tags in release notes
2 parents f654c0a + 55fffb2 commit 26aa610

File tree

3 files changed

+146
-32
lines changed

3 files changed

+146
-32
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
bump: patch
3+
---
4+
5+
Add comprehensive clickable links for all Docker image tags in release notes
6+
7+
Updated release notes generation to include 4 structured tables with clickable links for every Docker image tag (multi-arch, amd64, arm64) on both Docker Hub and GitHub Container Registry.

.github/workflows/release.yml

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1645,47 +1645,58 @@ jobs:
16451645
DATE=$(date +%Y-%m-%d)
16461646
REPO="${{ github.repository }}"
16471647
1648-
# Create release notes file
1648+
# Create release notes file with comprehensive clickable links
1649+
# Issue #39: All tags should have clickable links for both Docker Hub and GHCR
16491650
cat > /tmp/release-notes.md << ENDOFNOTES
16501651
## Docker Images
16511652
1652-
### Full Sandbox (konard/sandbox)
1653-
- [\`${DOCKERHUB_IMAGE}:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}) (multi-arch)
1654-
- [\`${DOCKERHUB_IMAGE}:${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}) (AMD64)
1655-
- [\`${DOCKERHUB_IMAGE}:${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}) (ARM64)
1653+
### Docker Hub - Combo Sandboxes
16561654
1657-
### Essentials Sandbox (konard/sandbox-essentials)
1658-
- [\`${DOCKERHUB_IMAGE}-essentials:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials) (multi-arch)
1659-
- [\`${DOCKERHUB_IMAGE}-essentials:${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials) (AMD64)
1660-
- [\`${DOCKERHUB_IMAGE}-essentials:${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials) (ARM64)
1655+
| Image | Multi-arch | AMD64 | ARM64 |
1656+
|-------|------------|-------|-------|
1657+
| Full Sandbox | [\`${DOCKERHUB_IMAGE}:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}/tags?name=${VERSION}-arm64) |
1658+
| Essentials | [\`${DOCKERHUB_IMAGE}-essentials:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials/tags?name=${VERSION}-arm64) |
1659+
| JS | [\`${DOCKERHUB_IMAGE}-js:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js/tags?name=${VERSION}-arm64) |
16611660
1662-
### JS Sandbox (konard/sandbox-js)
1663-
- [\`${DOCKERHUB_IMAGE}-js:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js) (multi-arch)
1664-
- [\`${DOCKERHUB_IMAGE}-js:${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js) (AMD64)
1665-
- [\`${DOCKERHUB_IMAGE}-js:${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js) (ARM64)
1661+
### Docker Hub - Language Sandboxes
16661662
1667-
### Language Sandboxes
1668-
Each language sandbox is available in multi-arch, AMD64, and ARM64 variants:
1663+
| Language | Multi-arch | AMD64 | ARM64 |
1664+
|----------|------------|-------|-------|
1665+
| Python | [\`${DOCKERHUB_IMAGE}-python:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-python/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-python/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-python/tags?name=${VERSION}-arm64) |
1666+
| Go | [\`${DOCKERHUB_IMAGE}-go:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-go/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-go/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-go/tags?name=${VERSION}-arm64) |
1667+
| Rust | [\`${DOCKERHUB_IMAGE}-rust:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rust/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rust/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rust/tags?name=${VERSION}-arm64) |
1668+
| Java | [\`${DOCKERHUB_IMAGE}-java:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-java/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-java/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-java/tags?name=${VERSION}-arm64) |
1669+
| Kotlin | [\`${DOCKERHUB_IMAGE}-kotlin:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-kotlin/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-kotlin/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-kotlin/tags?name=${VERSION}-arm64) |
1670+
| Ruby | [\`${DOCKERHUB_IMAGE}-ruby:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-ruby/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-ruby/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-ruby/tags?name=${VERSION}-arm64) |
1671+
| PHP | [\`${DOCKERHUB_IMAGE}-php:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-php/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-php/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-php/tags?name=${VERSION}-arm64) |
1672+
| Perl | [\`${DOCKERHUB_IMAGE}-perl:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-perl/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-perl/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-perl/tags?name=${VERSION}-arm64) |
1673+
| Swift | [\`${DOCKERHUB_IMAGE}-swift:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-swift/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-swift/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-swift/tags?name=${VERSION}-arm64) |
1674+
| Lean | [\`${DOCKERHUB_IMAGE}-lean:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-lean/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-lean/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-lean/tags?name=${VERSION}-arm64) |
1675+
| Rocq | [\`${DOCKERHUB_IMAGE}-rocq:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rocq/tags?name=${VERSION}) | [\`${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rocq/tags?name=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rocq/tags?name=${VERSION}-arm64) |
1676+
1677+
### GitHub Container Registry - Combo Sandboxes
1678+
1679+
| Image | Multi-arch | AMD64 | ARM64 |
1680+
|-------|------------|-------|-------|
1681+
| Full Sandbox | [\`${GHCR_IMAGE}:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox?tag=${VERSION}-arm64) |
1682+
| Essentials | [\`${GHCR_IMAGE}-essentials:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-essentials?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-essentials?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-essentials?tag=${VERSION}-arm64) |
1683+
| JS | [\`${GHCR_IMAGE}-js:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-js?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-js?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-js?tag=${VERSION}-arm64) |
1684+
1685+
### GitHub Container Registry - Language Sandboxes
16691686
16701687
| Language | Multi-arch | AMD64 | ARM64 |
16711688
|----------|------------|-------|-------|
1672-
| Python | [\`${DOCKERHUB_IMAGE}-python:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-python) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
1673-
| Go | [\`${DOCKERHUB_IMAGE}-go:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-go) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
1674-
| Rust | [\`${DOCKERHUB_IMAGE}-rust:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rust) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
1675-
| Java | [\`${DOCKERHUB_IMAGE}-java:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-java) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
1676-
| Kotlin | [\`${DOCKERHUB_IMAGE}-kotlin:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-kotlin) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
1677-
| Ruby | [\`${DOCKERHUB_IMAGE}-ruby:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-ruby) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
1678-
| PHP | [\`${DOCKERHUB_IMAGE}-php:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-php) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
1679-
| Perl | [\`${DOCKERHUB_IMAGE}-perl:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-perl) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
1680-
| Swift | [\`${DOCKERHUB_IMAGE}-swift:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-swift) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
1681-
| Lean | [\`${DOCKERHUB_IMAGE}-lean:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-lean) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
1682-
| Rocq | [\`${DOCKERHUB_IMAGE}-rocq:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rocq) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
1683-
1684-
### GitHub Container Registry (GHCR)
1685-
All images are also available on GHCR with the same tag patterns:
1686-
- [\`${GHCR_IMAGE}:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox) (multi-arch, AMD64: \`${VERSION}-amd64\`, ARM64: \`${VERSION}-arm64\`)
1687-
- [\`${GHCR_IMAGE}-essentials:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-essentials) (multi-arch, AMD64: \`${VERSION}-amd64\`, ARM64: \`${VERSION}-arm64\`)
1688-
- [\`${GHCR_IMAGE}-js:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-js) (multi-arch, AMD64: \`${VERSION}-amd64\`, ARM64: \`${VERSION}-arm64\`)
1689+
| Python | [\`${GHCR_IMAGE}-python:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-python?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-python?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-python?tag=${VERSION}-arm64) |
1690+
| Go | [\`${GHCR_IMAGE}-go:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-go?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-go?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-go?tag=${VERSION}-arm64) |
1691+
| Rust | [\`${GHCR_IMAGE}-rust:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-rust?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-rust?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-rust?tag=${VERSION}-arm64) |
1692+
| Java | [\`${GHCR_IMAGE}-java:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-java?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-java?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-java?tag=${VERSION}-arm64) |
1693+
| Kotlin | [\`${GHCR_IMAGE}-kotlin:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-kotlin?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-kotlin?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-kotlin?tag=${VERSION}-arm64) |
1694+
| Ruby | [\`${GHCR_IMAGE}-ruby:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-ruby?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-ruby?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-ruby?tag=${VERSION}-arm64) |
1695+
| PHP | [\`${GHCR_IMAGE}-php:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-php?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-php?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-php?tag=${VERSION}-arm64) |
1696+
| Perl | [\`${GHCR_IMAGE}-perl:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-perl?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-perl?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-perl?tag=${VERSION}-arm64) |
1697+
| Swift | [\`${GHCR_IMAGE}-swift:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-swift?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-swift?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-swift?tag=${VERSION}-arm64) |
1698+
| Lean | [\`${GHCR_IMAGE}-lean:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-lean?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-lean?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-lean?tag=${VERSION}-arm64) |
1699+
| Rocq | [\`${GHCR_IMAGE}-rocq:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-rocq?tag=${VERSION}) | [\`${VERSION}-amd64\`](https://github.com/${REPO}/pkgs/container/sandbox-rocq?tag=${VERSION}-amd64) | [\`${VERSION}-arm64\`](https://github.com/${REPO}/pkgs/container/sandbox-rocq?tag=${VERSION}-arm64) |
16891700
16901701
## Architecture
16911702
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# Case Study: Issue #39 - Multi-arch Docker Image Tags in Release Notes
2+
3+
## Summary
4+
5+
This case study documents the investigation and resolution of GitHub issue #39, which identified incomplete documentation of Docker image tags in release notes. The release notes were not providing clickable links for all architecture-specific tags, making it difficult for users to find and pull specific architecture images from both Docker Hub and GitHub Container Registry (GHCR).
6+
7+
## Timeline
8+
9+
| Date | Event |
10+
|------|-------|
11+
| 2026-02-01 | v1.3.0 released with limited architecture-specific tag documentation |
12+
| 2026-02-13 | v1.3.2 released with improved but still incomplete tag documentation |
13+
| 2026-02-15 | Issue #39 opened identifying the documentation gap |
14+
| 2026-02-15 | Comment added clarifying requirement for comprehensive clickable links |
15+
16+
## Problem Analysis
17+
18+
### Original Issue
19+
20+
The release notes at [v1.3.0](https://github.com/link-foundation/sandbox/releases/tag/v1.3.0) did not include:
21+
- Architecture-specific tags (-amd64, -arm64) for language sandboxes
22+
- Architecture-specific tags for essentials and JS sandboxes
23+
- Separate GHCR listings with all architecture variants
24+
25+
### Partial Fix in v1.3.2
26+
27+
The [v1.3.2](https://github.com/link-foundation/sandbox/releases/tag/v1.3.2) release improved documentation by:
28+
- Adding architecture tags for Full Sandbox, Essentials, and JS sandboxes
29+
- Adding a table for language sandboxes with architecture columns
30+
31+
However, the table still had issues:
32+
- Only the Multi-arch column had clickable links to Docker Hub
33+
- AMD64 and ARM64 columns showed tag names without clickable links
34+
- GHCR section only mentioned that images are "available" without clickable links for each variant
35+
36+
### User Requirement (from comment)
37+
38+
The user requested:
39+
> "We need to have table for all images... for each tag we should have clickable link, and not only on Docker Hub, but also in GitHub Registry. So we should have at least 6 columns for each language version, or we can have 4 tables, so 2 of them are for language sandboxes, and 1 of these table will be dedicated to Docker Hub, and another for GitHub Registry, so in both table we will have 3 columns with clickable links."
40+
41+
## Root Cause
42+
43+
The release notes generation in `.github/workflows/release.yml` at the `create-release` job used a template that:
44+
45+
1. Created markdown tables without clickable links for architecture-specific tags
46+
2. Only linked the multi-arch tag to Docker Hub for language sandboxes
47+
3. Listed GHCR images in text format without individual clickable links for each architecture
48+
49+
## Solution
50+
51+
### Design Decision
52+
53+
After analyzing the options, we chose to use **4 separate tables** approach:
54+
- 2 tables for Docker Hub (combo sandboxes + language sandboxes)
55+
- 2 tables for GHCR (combo sandboxes + language sandboxes)
56+
57+
This provides better readability than cramming 6 columns into one table, especially on mobile devices.
58+
59+
### Implementation
60+
61+
Modified the release notes template in `.github/workflows/release.yml` to generate:
62+
63+
1. **Docker Hub Combo Sandboxes Table**: Full, Essentials, JS sandboxes with 3 clickable link columns
64+
2. **Docker Hub Language Sandboxes Table**: All 11 languages with 3 clickable link columns
65+
3. **GHCR Combo Sandboxes Table**: Full, Essentials, JS sandboxes with 3 clickable link columns
66+
4. **GHCR Language Sandboxes Table**: All 11 languages with 3 clickable link columns
67+
68+
Each clickable link follows the pattern:
69+
- Docker Hub: `https://hub.docker.com/r/konard/sandbox-{lang}/tags?name={version}-{arch}`
70+
- GHCR: `https://github.com/link-foundation/sandbox/pkgs/container/sandbox-{lang}?tag={version}-{arch}`
71+
72+
## Key Learnings
73+
74+
1. **User Experience**: Release notes should make it easy for users to directly access what they need. Clickable links are more valuable than plain text tags.
75+
76+
2. **Multi-registry Support**: Modern container distributions often publish to multiple registries (Docker Hub + GHCR). Documentation should equally serve users of both registries.
77+
78+
3. **Architecture Awareness**: With ARM64 adoption increasing (Apple Silicon, Raspberry Pi, AWS Graviton), architecture-specific documentation is increasingly important.
79+
80+
## Files Changed
81+
82+
- `.github/workflows/release.yml`: Updated `create-release` job to generate comprehensive tables with clickable links
83+
84+
## Testing
85+
86+
The release notes format can be validated by:
87+
1. Running the workflow manually with `workflow_dispatch`
88+
2. Checking that all generated links are valid and point to correct registry pages
89+
90+
## References
91+
92+
- [GitHub Issue #39](https://github.com/link-foundation/sandbox/issues/39)
93+
- [v1.3.0 Release](https://github.com/link-foundation/sandbox/releases/tag/v1.3.0) - Original incomplete format
94+
- [v1.3.2 Release](https://github.com/link-foundation/sandbox/releases/tag/v1.3.2) - Partially improved format
95+
- [Docker Hub sandbox](https://hub.docker.com/r/konard/sandbox)
96+
- [GHCR sandbox](https://github.com/link-foundation/sandbox/pkgs/container/sandbox)

0 commit comments

Comments
 (0)