diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c7825e1b9754d599476ad28a1e9ac1f9c014464b..144292f75b8d89fdf3edcad9e88aea4b84bb40c1 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -4,6 +4,7 @@ on:
   push:
     branches:
       - master
+      - v24
 
   workflow_dispatch:
 
diff --git a/.github/workflows/release-npm.yml b/.github/workflows/release-npm.yml
index fac7bcb140545e75b7dede7021161f936aa1d593..a26410c73baea609b34d990e3673aadf3952d109 100644
--- a/.github/workflows/release-npm.yml
+++ b/.github/workflows/release-npm.yml
@@ -51,6 +51,6 @@ jobs:
       - name: Publish ${{ github.event.client_payload.version }}
         run: |
           echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}' >> ~/.npmrc
-          npm publish
+          npm publish --tag ${{ github.event.client_payload.tag }}
         env:
           NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/.releaserc b/.releaserc
index 625c7479a8e76089ca391c53334f00a9f1f11744..e6ca1a4e3d47cc994da619c544365f215174325f 100644
--- a/.releaserc
+++ b/.releaserc
@@ -12,7 +12,7 @@
       "@semantic-release/exec",
       {
         "verifyConditionsCmd": "run-s verify",
-        "publishCmd": "run-s \"release -- {@}\" -- --release=${nextRelease.version} --sha=${nextRelease.gitHead}"
+        "publishCmd": "run-s \"release -- {@}\" -- --release=${nextRelease.version} --sha=${nextRelease.gitHead} --tag=${nextRelease.channel}"
       }
     ]
   ],
@@ -82,5 +82,15 @@
       }
     ]
   },
-  "tagFormat": "${version}"
+  "tagFormat": "${version}",
+  "branches": [
+    {
+      "name": "v24",
+      "range": "24.x",
+      "channel": "v24"
+    },
+    {
+      "name": "master"
+    }
+  ]
 }
diff --git a/tools/dispatch-release.mjs b/tools/dispatch-release.mjs
index b1beb8a53648cc4ca44b2aa71c08111d61ba8aff..927d6e52b1e25432b36b6cfa9f7091f16d52c20c 100644
--- a/tools/dispatch-release.mjs
+++ b/tools/dispatch-release.mjs
@@ -1,9 +1,10 @@
 import got from 'got';
 import shell from 'shelljs';
-import { program } from './utils.mjs';
+import { options } from './utils.mjs';
 
-const version = program.release;
-const dry = program.dryRun;
+const version = options.release;
+const tag = options.tag;
+const dry = options.dryRun;
 
 shell.echo(`Dispatching version: ${version}`);
 
@@ -27,6 +28,7 @@ shell.echo(`Dispatching version: ${version}`);
           sha: process.env.GITHUB_SHA,
           ref: process.env.GITHUB_REF,
           version,
+          tag,
         },
       },
     }
diff --git a/tools/release.mjs b/tools/release.mjs
index a475489216cc4c50a7a5c417e45e92f5b174d501..eb1d20f3ea4294a5eb37f0c3439060cc30fc4226 100644
--- a/tools/release.mjs
+++ b/tools/release.mjs
@@ -1,7 +1,7 @@
 import shell from 'shelljs';
-import { program } from './utils.mjs';
+import { options } from './utils.mjs';
 
-const version = program.release;
+const version = options.release;
 // const sha = program.sha;
 
 // let err = false;
diff --git a/tools/utils.mjs b/tools/utils.mjs
index 49f1e215ffe156226c7a56b991922e5cb5760ddc..6840a0236d3616b7b9f00ef0daa2a1b6d8aaf4d5 100644
--- a/tools/utils.mjs
+++ b/tools/utils.mjs
@@ -5,11 +5,14 @@ const program = new commander.Command();
 program
   .version('0.0.1')
   .requiredOption('-r, --release <type>', 'Version to use')
-  .option('-s, --sha <type>', 'Sha to use')
+  .option('-s, --sha <type>', 'Git sha to use')
+  .option('-t, --tag <type>', 'Npm dist-tag to publish to', 'latest')
   .option('-d, --dry-run');
 
 program.parse(process.argv);
 
+export const options = program.opts();
+
 export { program };
 
 /**