Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/issue-39-release-notes-links.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
bump: patch
---

Add comprehensive clickable links for all Docker image tags in release notes

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.
75 changes: 43 additions & 32 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1645,47 +1645,58 @@ jobs:
DATE=$(date +%Y-%m-%d)
REPO="${{ github.repository }}"

# Create release notes file
# Create release notes file with comprehensive clickable links
# Issue #39: All tags should have clickable links for both Docker Hub and GHCR
cat > /tmp/release-notes.md << ENDOFNOTES
## Docker Images

### Full Sandbox (konard/sandbox)
- [\`${DOCKERHUB_IMAGE}:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}) (multi-arch)
- [\`${DOCKERHUB_IMAGE}:${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}) (AMD64)
- [\`${DOCKERHUB_IMAGE}:${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}) (ARM64)
### Docker Hub - Combo Sandboxes

### Essentials Sandbox (konard/sandbox-essentials)
- [\`${DOCKERHUB_IMAGE}-essentials:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-essentials:${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials) (AMD64)
- [\`${DOCKERHUB_IMAGE}-essentials:${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials) (ARM64)
| Image | Multi-arch | AMD64 | ARM64 |
|-------|------------|-------|-------|
| 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) |
| 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) |
| 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) |

### JS Sandbox (konard/sandbox-js)
- [\`${DOCKERHUB_IMAGE}-js:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-js:${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js) (AMD64)
- [\`${DOCKERHUB_IMAGE}-js:${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js) (ARM64)
### Docker Hub - Language Sandboxes

### Language Sandboxes
Each language sandbox is available in multi-arch, AMD64, and ARM64 variants:
| Language | Multi-arch | AMD64 | ARM64 |
|----------|------------|-------|-------|
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |

### GitHub Container Registry - Combo Sandboxes

| Image | Multi-arch | AMD64 | ARM64 |
|-------|------------|-------|-------|
| 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) |
| 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) |
| 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) |

### GitHub Container Registry - Language Sandboxes

| Language | Multi-arch | AMD64 | ARM64 |
|----------|------------|-------|-------|
| Python | [\`${DOCKERHUB_IMAGE}-python:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-python) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Go | [\`${DOCKERHUB_IMAGE}-go:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-go) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Rust | [\`${DOCKERHUB_IMAGE}-rust:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rust) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Java | [\`${DOCKERHUB_IMAGE}-java:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-java) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Kotlin | [\`${DOCKERHUB_IMAGE}-kotlin:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-kotlin) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Ruby | [\`${DOCKERHUB_IMAGE}-ruby:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-ruby) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| PHP | [\`${DOCKERHUB_IMAGE}-php:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-php) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Perl | [\`${DOCKERHUB_IMAGE}-perl:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-perl) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Swift | [\`${DOCKERHUB_IMAGE}-swift:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-swift) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Lean | [\`${DOCKERHUB_IMAGE}-lean:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-lean) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Rocq | [\`${DOCKERHUB_IMAGE}-rocq:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rocq) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |

### GitHub Container Registry (GHCR)
All images are also available on GHCR with the same tag patterns:
- [\`${GHCR_IMAGE}:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox) (multi-arch, AMD64: \`${VERSION}-amd64\`, ARM64: \`${VERSION}-arm64\`)
- [\`${GHCR_IMAGE}-essentials:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-essentials) (multi-arch, AMD64: \`${VERSION}-amd64\`, ARM64: \`${VERSION}-arm64\`)
- [\`${GHCR_IMAGE}-js:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-js) (multi-arch, AMD64: \`${VERSION}-amd64\`, ARM64: \`${VERSION}-arm64\`)
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |

## Architecture

Expand Down
96 changes: 96 additions & 0 deletions docs/case-studies/issue-39/CASE-STUDY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# Case Study: Issue #39 - Multi-arch Docker Image Tags in Release Notes

## Summary

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).

## Timeline

| Date | Event |
|------|-------|
| 2026-02-01 | v1.3.0 released with limited architecture-specific tag documentation |
| 2026-02-13 | v1.3.2 released with improved but still incomplete tag documentation |
| 2026-02-15 | Issue #39 opened identifying the documentation gap |
| 2026-02-15 | Comment added clarifying requirement for comprehensive clickable links |

## Problem Analysis

### Original Issue

The release notes at [v1.3.0](https://github.com/link-foundation/sandbox/releases/tag/v1.3.0) did not include:
- Architecture-specific tags (-amd64, -arm64) for language sandboxes
- Architecture-specific tags for essentials and JS sandboxes
- Separate GHCR listings with all architecture variants

### Partial Fix in v1.3.2

The [v1.3.2](https://github.com/link-foundation/sandbox/releases/tag/v1.3.2) release improved documentation by:
- Adding architecture tags for Full Sandbox, Essentials, and JS sandboxes
- Adding a table for language sandboxes with architecture columns

However, the table still had issues:
- Only the Multi-arch column had clickable links to Docker Hub
- AMD64 and ARM64 columns showed tag names without clickable links
- GHCR section only mentioned that images are "available" without clickable links for each variant

### User Requirement (from comment)

The user requested:
> "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."

## Root Cause

The release notes generation in `.github/workflows/release.yml` at the `create-release` job used a template that:

1. Created markdown tables without clickable links for architecture-specific tags
2. Only linked the multi-arch tag to Docker Hub for language sandboxes
3. Listed GHCR images in text format without individual clickable links for each architecture

## Solution

### Design Decision

After analyzing the options, we chose to use **4 separate tables** approach:
- 2 tables for Docker Hub (combo sandboxes + language sandboxes)
- 2 tables for GHCR (combo sandboxes + language sandboxes)

This provides better readability than cramming 6 columns into one table, especially on mobile devices.

### Implementation

Modified the release notes template in `.github/workflows/release.yml` to generate:

1. **Docker Hub Combo Sandboxes Table**: Full, Essentials, JS sandboxes with 3 clickable link columns
2. **Docker Hub Language Sandboxes Table**: All 11 languages with 3 clickable link columns
3. **GHCR Combo Sandboxes Table**: Full, Essentials, JS sandboxes with 3 clickable link columns
4. **GHCR Language Sandboxes Table**: All 11 languages with 3 clickable link columns

Each clickable link follows the pattern:
- Docker Hub: `https://hub.docker.com/r/konard/sandbox-{lang}/tags?name={version}-{arch}`
- GHCR: `https://github.com/link-foundation/sandbox/pkgs/container/sandbox-{lang}?tag={version}-{arch}`

## Key Learnings

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.

2. **Multi-registry Support**: Modern container distributions often publish to multiple registries (Docker Hub + GHCR). Documentation should equally serve users of both registries.

3. **Architecture Awareness**: With ARM64 adoption increasing (Apple Silicon, Raspberry Pi, AWS Graviton), architecture-specific documentation is increasingly important.

## Files Changed

- `.github/workflows/release.yml`: Updated `create-release` job to generate comprehensive tables with clickable links

## Testing

The release notes format can be validated by:
1. Running the workflow manually with `workflow_dispatch`
2. Checking that all generated links are valid and point to correct registry pages

## References

- [GitHub Issue #39](https://github.com/link-foundation/sandbox/issues/39)
- [v1.3.0 Release](https://github.com/link-foundation/sandbox/releases/tag/v1.3.0) - Original incomplete format
- [v1.3.2 Release](https://github.com/link-foundation/sandbox/releases/tag/v1.3.2) - Partially improved format
- [Docker Hub sandbox](https://hub.docker.com/r/konard/sandbox)
- [GHCR sandbox](https://github.com/link-foundation/sandbox/pkgs/container/sandbox)