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
70 changes: 35 additions & 35 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@ jobs:

- name: Setup External Dependencies
run: |
mkdir -p external external/kiss_fft
git clone --depth 1 --branch v1.90.1 https://github.com/ocornut/imgui.git external/imgui &
curl -sL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h &
curl -sL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h &
curl -sL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h &
mkdir -p external/kiss_fft
curl -sL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h &
curl -sL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c &
curl -sL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h &
curl -sL -o external/kiss_fft/kiss_fft_log.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft_log.h &
curl -fsSL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h &
curl -fsSL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h &
curl -fsSL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h &
curl -fsSL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h &
curl -fsSL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c &
curl -fsSL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h &
curl -fsSL -o external/kiss_fft/kiss_fft_log.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft_log.h &
wait
Comment on lines +42 to 51

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "1) Confirm workflow uses background jobs followed by bare wait:"
rg -n -C2 'curl -fsSL.*&|git clone .*&|^\s*wait\s*$' .github/workflows/ci.yml

echo
echo "2) Demonstrate why bare wait is risky with parallel jobs:"
(
  set +e
  (sleep 0.1; false) &
  (sleep 0.2; true) &
  wait
  rc=$?
  echo "bare wait exit code: $rc (can be 0 even when one job failed)"
)

echo
echo "3) Robust pattern check: waiting each PID surfaces any failure."
(
  set +e
  pids=()
  (sleep 0.1; false) & pids+=($!)
  (sleep 0.2; true) & pids+=($!)
  overall=0
  for pid in "${pids[@]}"; do
    wait "$pid" || overall=$?
  done
  echo "per-pid wait overall exit code: $overall (non-zero when any job fails)"
)

Repository: sudip-mondal-2002/Amplitron

Length of output: 7092


Fix bare wait to properly fail when any background download job fails

In Lines 42-51, 89-98, 235-245, 346-355, 427-437, and 493-503, background downloads are followed by bare wait, which can return 0 even when one job fails. This allows failed downloads to go undetected. Capture PIDs and wait on each one individually:

Suggested fix
-        git clone --depth 1 --branch v1.90.1 https://github.com/ocornut/imgui.git external/imgui &
-        curl -fsSL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h &
-        curl -fsSL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h &
-        curl -fsSL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h &
-        curl -fsSL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h &
-        curl -fsSL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c &
-        curl -fsSL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h &
-        curl -fsSL -o external/kiss_fft/kiss_fft_log.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft_log.h &
-        wait
+        pids=()
+        git clone --depth 1 --branch v1.90.1 https://github.com/ocornut/imgui.git external/imgui & pids+=($!)
+        curl -fsSL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h & pids+=($!)
+        curl -fsSL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h & pids+=($!)
+        curl -fsSL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h & pids+=($!)
+        curl -fsSL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h & pids+=($!)
+        curl -fsSL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c & pids+=($!)
+        curl -fsSL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h & pids+=($!)
+        curl -fsSL -o external/kiss_fft/kiss_fft_log.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft_log.h & pids+=($!)
+        for pid in "${pids[@]}"; do
+          wait "$pid"
+        done
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 42 - 51, Replace each bare use of wait
after launching background download processes with code that captures each
background PID (e.g., pid=$! or pids+=("$!")) and then loops over those PIDs to
run wait "$pid" and check its exit status; update the CI workflow steps that
start background downloads (the blocks using backgrounded curl/wget/download
commands followed by wait) to collect PIDs and fail the step if any individual
wait returns non-zero so a single failed download causes the job to fail.


- name: Generate Version
Expand Down Expand Up @@ -86,15 +86,15 @@ jobs:

- name: Setup External Dependencies
run: |
mkdir -p external external/kiss_fft
git clone --depth 1 --branch v1.90.1 https://github.com/ocornut/imgui.git external/imgui &
curl -sL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h &
curl -sL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h &
curl -sL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h &
mkdir -p external/kiss_fft
curl -sL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h &
curl -sL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c &
curl -sL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h &
curl -sL -o external/kiss_fft/kiss_fft_log.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft_log.h &
curl -fsSL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h &
curl -fsSL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h &
curl -fsSL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h &
curl -fsSL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h &
curl -fsSL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c &
curl -fsSL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h &
curl -fsSL -o external/kiss_fft/kiss_fft_log.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft_log.h &
wait

- name: Generate Version
Expand Down Expand Up @@ -233,15 +233,15 @@ jobs:

- name: Setup External Dependencies
run: |
mkdir -p external external/kiss_fft
git clone --depth 1 --branch v1.90.1 https://github.com/ocornut/imgui.git external/imgui &
curl -sL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h &
curl -sL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h &
curl -sL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h &
mkdir -p external/kiss_fft
curl -sL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h &
curl -sL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c &
curl -sL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h &
curl -sL -o external/kiss_fft/kiss_fft_log.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft_log.h &
curl -fsSL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h &
curl -fsSL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h &
curl -fsSL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h &
curl -fsSL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h &
curl -fsSL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c &
curl -fsSL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h &
curl -fsSL -o external/kiss_fft/kiss_fft_log.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft_log.h &
wait

- name: Generate Version
Expand Down Expand Up @@ -343,15 +343,15 @@ jobs:
- name: Setup External Dependencies
shell: msys2 {0}
run: |
mkdir -p external external/kiss_fft
git clone --depth 1 --branch v1.90.1 https://github.com/ocornut/imgui.git external/imgui &
curl -sL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h &
curl -sL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h &
curl -sL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h &
mkdir -p external/kiss_fft
curl -sL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h &
curl -sL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c &
curl -sL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h &
curl -sL -o external/kiss_fft/kiss_fft_log.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft_log.h &
curl -fsSL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h &
curl -fsSL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h &
curl -fsSL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h &
curl -fsSL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h &
curl -fsSL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c &
curl -fsSL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h &
curl -fsSL -o external/kiss_fft/kiss_fft_log.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft_log.h &
wait

- name: Generate Version
Expand Down Expand Up @@ -425,11 +425,11 @@ jobs:

- name: Setup External Dependencies
run: |
mkdir -p external external/kiss_fft
git clone --depth 1 --branch v1.90.1 https://github.com/ocornut/imgui.git external/imgui &
curl -fsSL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h &
curl -fsSL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h &
curl -fsSL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h &
mkdir -p external/kiss_fft
curl -fsSL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h &
curl -fsSL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c &
curl -fsSL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h &
Expand Down Expand Up @@ -491,11 +491,11 @@ jobs:

- name: Setup External Dependencies
run: |
mkdir -p external external/kiss_fft
git clone --depth 1 --branch v1.90.1 https://github.com/ocornut/imgui.git external/imgui &
curl -fsSL -o external/nanosvg.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvg.h &
curl -fsSL -o external/nanosvgrast.h https://raw.githubusercontent.com/memononen/nanosvg/master/src/nanosvgrast.h &
curl -fsSL -o external/dr_wav.h https://raw.githubusercontent.com/mackron/dr_libs/master/dr_wav.h &
mkdir -p external/kiss_fft
curl -fsSL -o external/kiss_fft/kiss_fft.h https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.h &
curl -fsSL -o external/kiss_fft/kiss_fft.c https://raw.githubusercontent.com/mborgerding/kissfft/master/kiss_fft.c &
curl -fsSL -o external/kiss_fft/_kiss_fft_guts.h https://raw.githubusercontent.com/mborgerding/kissfft/master/_kiss_fft_guts.h &
Expand All @@ -518,7 +518,7 @@ jobs:
- name: Build SDL2 for iOS
if: steps.sdl2-ios-cache.outputs.cache-hit != 'true'
run: |
curl -sL https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.12.tar.gz | tar xz
curl -fsSL https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.12.tar.gz | tar xz
cmake -S SDL-release-2.30.12 -B sdl2-build \
-G "Unix Makefiles" \
-DCMAKE_SYSTEM_NAME=iOS \
Expand Down
188 changes: 187 additions & 1 deletion .github/workflows/deploy-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,190 @@ jobs:
github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
- run: echo "hello"
- name: Download CI web build artifact
uses: actions/download-artifact@v8
with:
name: web-build
path: web-build
run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }}

- name: Stage preview artifact
id: preview-meta
run: |
pr_number="${{ github.event.workflow_run.pull_requests[0].number }}"
head_sha="${{ github.event.workflow_run.head_sha }}"

if ! [[ "$pr_number" =~ ^[0-9]+$ ]]; then
echo "Unable to determine a valid pull request number from workflow_run payload."
exit 1
fi

mkdir -p preview

for file in \
web-build/index.html \
web-build/index.js \
web-build/index.wasm \
web-build/index.data \
web-build/*.worker.js \
web-build/coi-serviceworker.js
do
[ -e "$file" ] && cp "$file" preview/
done

test -f preview/index.html
test -f preview/index.js
test -f preview/index.wasm
touch preview/.nojekyll

preview_path="pr-previews/pr-${pr_number}"
preview_url="https://amplitron.sudipmondal.co.in/${preview_path}/"

echo "pr_number=$pr_number" >> "$GITHUB_OUTPUT"
echo "head_sha=$head_sha" >> "$GITHUB_OUTPUT"
echo "preview_path=$preview_path" >> "$GITHUB_OUTPUT"
echo "preview_url=$preview_url" >> "$GITHUB_OUTPUT"
echo "short_sha=${head_sha:0:7}" >> "$GITHUB_OUTPUT"

- name: Check pull request state
id: pr-state
uses: actions/github-script@v8
with:
script: |
const { owner, repo } = context.repo;
const pull_number = Number('${{ steps.preview-meta.outputs.pr_number }}');
const { data: pull } = await github.rest.pulls.get({
owner,
repo,
pull_number,
});
core.setOutput('state', pull.state);

- name: Publish preview to GitHub Pages
if: steps.pr-state.outputs.state == 'open'
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./preview
publish_branch: gh-pages
destination_dir: ${{ steps.preview-meta.outputs.preview_path }}
keep_files: true
enable_jekyll: false

- name: Comment preview URL on PR
if: steps.pr-state.outputs.state == 'open'
uses: actions/github-script@v8
env:
PR_NUMBER: ${{ steps.preview-meta.outputs.pr_number }}
PREVIEW_URL: ${{ steps.preview-meta.outputs.preview_url }}
PREVIEW_PATH: ${{ steps.preview-meta.outputs.preview_path }}
SHORT_SHA: ${{ steps.preview-meta.outputs.short_sha }}
with:
script: |
const marker = '<!-- amplitron-pr-preview -->';
const { owner, repo } = context.repo;
const issue_number = Number(process.env.PR_NUMBER);
const body = [
marker,
'### PR Preview Ready',
'',
`Preview URL: ${process.env.PREVIEW_URL}`,
'',
`Built from commit \`${process.env.SHORT_SHA}\` and deployed to \`${process.env.PREVIEW_PATH}\`.`,
'This preview updates automatically when the PR branch changes and is removed when the PR closes.',
].join('\n');

const { data: comments } = await github.rest.issues.listComments({
owner,
repo,
issue_number,
per_page: 100,
});
const previous = comments.find((comment) =>
comment.user?.type === 'Bot' && comment.body?.includes(marker)
);

if (previous) {
await github.rest.issues.updateComment({
owner,
repo,
comment_id: previous.id,
body,
});
} else {
await github.rest.issues.createComment({
owner,
repo,
issue_number,
body,
});
}

cleanup-preview:
name: Remove Closed PR Preview
if: github.event_name == 'pull_request_target'
runs-on: ubuntu-latest
steps:
- name: Checkout GitHub Pages branch
id: pages-checkout
uses: actions/checkout@v6
continue-on-error: true
with:
ref: gh-pages
path: pages
token: ${{ secrets.GITHUB_TOKEN }}

- name: Remove preview directory
if: steps.pages-checkout.outcome == 'success'
working-directory: pages
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
target="pr-previews/pr-${PR_NUMBER}"

if [ ! -d "$target" ]; then
echo "No preview directory found at $target"
exit 0
fi

rm -rf "$target"
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add -A "$target"
git commit -m "Remove preview for PR #${PR_NUMBER}"
git push

- name: Comment cleanup on PR
if: steps.pages-checkout.outcome == 'success'
uses: actions/github-script@v8
with:
script: |
const marker = '<!-- amplitron-pr-preview -->';
const { owner, repo } = context.repo;
const issue_number = context.payload.pull_request.number;
const body = [
marker,
'### PR Preview Removed',
'',
'The GitHub Pages preview for this PR has been removed because the PR was closed.',
].join('\n');

const { data: comments } = await github.rest.issues.listComments({
owner,
repo,
issue_number,
per_page: 100,
});
const previous = comments.find((comment) =>
comment.user?.type === 'Bot' && comment.body?.includes(marker)
);

if (previous) {
await github.rest.issues.updateComment({
owner,
repo,
comment_id: previous.id,
body,
});
}
23 changes: 22 additions & 1 deletion DEPLOYMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,27 @@ This document explains the CI/CD pipeline and how to create releases.
4. Uploads installers to the release
5. Deploys web demo and download page to GitHub Pages

### 3. PR Preview Workflow (`.github/workflows/deploy-preview.yml`)

**Triggers**: Completed CI runs for Pull Requests to `main` or `develop`, and closed Pull Requests

**What they do**:
1. Reuse the `web-build` artifact from the existing CI workflow
2. Stage only the static preview files (`index.html`, JavaScript, WebAssembly, data, worker, and service worker files)
3. Deploy the preview to GitHub Pages under `pr-previews/pr-<number>/`
4. Post or update a PR comment with the live preview URL
5. Remove the preview directory automatically when the PR is closed

Preview URLs follow this format:

```text
https://amplitron.sudipmondal.co.in/pr-previews/pr-<number>/
```

Comment on lines +54 to +58

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use https://amplitron.sudipmondal.co.in/

The preview deployment intentionally reuses the existing CI web build instead of compiling the Emscripten target a second time. Pull Request code is built with read-only CI permissions, while the deploy workflow only publishes the trusted CI artifact to GitHub Pages.

Because GitHub only runs `workflow_run` workflows that already exist on the default branch, this preview workflow starts creating URLs after it is merged to `main`. The pull request that introduces the workflow cannot publish its own preview from the new workflow file.

## Creating a Release

### Step 1: Prepare the Release
Expand Down Expand Up @@ -97,7 +118,7 @@ To trigger a release manually, push to `main` and let CI complete. The release w
3. Branch: `gh-pages` / `root`
4. Click Save

The website will be available at: https://sudip-mondal-2002.github.io/Amplitron/
The website will be available at: https://amplitron.sudipmondal.co.in/

### Update the Download Page

Expand Down
Loading