This document catalogues the manual steps and prerequisites for the release workflow. The automated flow lives in .github/workflows/. Each automatable publish channel is gated on a repository variable — when the variable is true and the corresponding secret is configured, publishing is automatic. Otherwise the channel is skipped and the steps below serve as the manual fallback. Zed is the exception: it has no automated path at all and always requires a pull request against the registry.
RELEASE_PR_TOKENsecret: a Personal Access Token with repo contents-write. Used byrelease-pr.ymlto push the bump commit todevand open the release PR. The defaultGITHUB_TOKENis avoided because PRs opened with it don't trigger CI.devbranch as the default branch. Feature work lands ondev; only release PRs godev → main.- Branch protection on
main(PR + required CI) anddev(required CI on PRs).
- A publisher account named
synthpunkon the VS Code Marketplace. VS_MARKETPLACE_TOKENsecret: a Personal Access Token from the Marketplace publisher dashboard.PUBLISH_VSCODEvariable set totrueto enable auto-publishing.
- An account on OpenVSX.
OVSX_TOKENsecret: an access token from your OpenVSX settings.PUBLISH_OPENVSXvariable set totrueto enable auto-publishing.
Zed has no publish CLI and no token-based channel — the registry is a git repository, and every version ships as a pull request against it. Zed is never automated by release.yml; it is always a manual follow-up.
- A fork of
zed-industries/extensions, cloned locally (assumed at../extensionsbelow) with anupstreamremote pointing at the canonical repo. - Nothing else — no account, secret, or repository variable is involved.
The registry registers the extension as a git submodule of this repository plus an entry in its extensions.toml. Because our manifest lives at themes/zed/ rather than the repository root, that entry carries a path field:
[synthpunk-theme]
submodule = "extensions/synthpunk-theme"
path = "themes/zed"
version = "X.Y.Z"Two constraints are enforced by the registry's CI and are easy to trip over:
- The submodule must be named and located at
extensions/synthpunk-theme— matching theidinthemes/zed/extension.toml, not the name of this repository — and must use anhttps://URL. - The license is read from the extension directory only, never the repository root.
themes/zed/LICENSEis generated bybun run buildfor exactly this reason; do not delete it.
The extension ID is permanent. The registry rejects any PR that both adds and removes an ID, so synthpunk-theme cannot be renamed after the first submission — only the display name in extension.toml can change.
- An empty
slowdini/synthpunk.nvimrepository on GitHub. SYNTHPUNK_NVIM_DEPLOY_KEYsecret: an SSH deploy key with write access toslowdini/synthpunk.nvim.PUBLISH_NVIMvariable set totrueto enable auto-publishing.
If a publish variable is not set (or the secret is missing), the corresponding job is skipped. Run these commands manually after the GitHub release is created:
git checkout vX.Y.Z
cd themes/vscode
npx @vscode/vsce publish -p <VS_MARKETPLACE_TOKEN>git checkout vX.Y.Z
cd themes/vscode
npx @vscode/vsce package -o synthpunk-vX.Y.Z.vsix
npx ovsx publish synthpunk-vX.Y.Z.vsix -p <OVSX_TOKEN>Always manual. Both recipes assume the fork is at ../extensions with an upstream remote, and that vX.Y.Z has already been tagged here.
First submission (one time only):
cd ../extensions
git fetch upstream
git checkout -b add-synthpunk-theme upstream/main
git submodule add https://github.com/slowdini/synthpunk.git extensions/synthpunk-theme
git -C extensions/synthpunk-theme checkout vX.Y.Z
# add the [synthpunk-theme] entry shown above to extensions.toml
pnpm install && pnpm sort-extensions
git add extensions.toml .gitmodules extensions/synthpunk-theme
git commit -m "Add synthpunk theme"
git push -u origin add-synthpunk-themeThen open a PR against zed-industries/extensions titled Add synthpunk theme. Test the extension locally first (Zed → Extensions → Install Dev Extension → select themes/zed/); their CONTRIBUTING.md states that untested submissions are closed.
Subsequent versions:
cd ../extensions
git fetch upstream
git checkout -b update-synthpunk-vX.Y.Z upstream/main
git submodule update --init --recursive extensions/synthpunk-theme
git -C extensions/synthpunk-theme fetch --tags
git -C extensions/synthpunk-theme checkout vX.Y.Z
# bump `version` under [synthpunk-theme] in extensions.toml to X.Y.Z
pnpm install && pnpm sort-extensions
git add extensions.toml .gitmodules extensions/synthpunk-theme
git commit -m "Update synthpunk-theme to vX.Y.Z"
git push -u origin update-synthpunk-vX.Y.ZThe version in extensions.toml must exactly match the version in themes/zed/extension.toml at the pinned commit, and must not decrease.
git checkout vX.Y.Z
git clone git@github.com:slowdini/synthpunk.nvim.git /tmp/synthpunk.nvim
cd /tmp/synthpunk.nvim
rm -rf -- */
cp -r /path/to/synthpunk/themes/neovim/* .
git add -A
git commit -m "chore: release vX.Y.Z"
git tag vX.Y.Z
git push origin main
git push origin vX.Y.Z- Trigger: Actions → "Release PR" workflow → Run with version
X.Y.Z. - Bump:
release-pr.ymlbumps all manifests, commits todev, opensdev → mainPR. - Review: Edit the PR body with release notes, merge into
main. - Auto-release:
release.ymlon push tomain:- Tags
vX.Y.Z, creates GitHub Release (notes from PR body or auto-generated). - Builds all themes, uploads Starship + WezTerm files to the release.
- Builds VS Code VSIX, publishes to Marketplace/OpenVSX if configured.
- Splits
themes/neovim/toslowdini/synthpunk.nvimif configured.
- Tags
- Back-sync: Merge
mainback intodev. - Zed: Open the PR against
zed-industries/extensionsby hand — see the Zed section above. This channel is never automated.