This guide explains how maintainers release stable and pre-release versions.
ℹ️ Contributors don't need this — packaging and publishing are handled in GitHub by maintainers. For local dev and packaging, see DEVELOPING.md.
- Versioning Convention
- Pre-Release Flow (Automated)
- Stable Release Flow (Manual)
- Screenshot & Image Policy
- Marketplace README Limitation
- Marking Pre-Release-Only Features
We follow VS Code's recommended odd/even pre-release scheme:
Why this convention: Marketplace publishing supports
major.minor.patchonly (no SemVer pre-release identifiers), so pre-release and stable builds must use different numeric versions. We use odd/even minors for that split. See microsoft/vsmarketplace#50.
- Stable —
major.EVEN.patch(e.g.1.18.1). The minor is always even. - Pre-release —
major.ODD.yyyymmdd(e.g.1.19.20260529). The minor is the next odd number and the patch is the build date.
Keep the committed lana/package.json version on the current stable (even minor).
Pre-releases are fully automated by .github/workflows/cd-prerelease.yml. No manual action is required.
- Trigger — weekly cron (Tuesdays 04:15 UTC) plus manual
workflow_dispatch. checkjob — comparesHEADagainst the floatingpretag and the latest stable tag. IfHEADalready matches either (no new commits since the last pre-release or stable), it exits early and nothing is published.publishjob — when there are new commits it bumps a CI-only pre-release version, packages and publishes with--pre-release, then moves the floatingpretag toHEAD.
A stable release is cut by hand. Do these steps in order:
-
Choose the release branch.
- Use
mainfor the current stable line. - Create/use a release branch only when shipping a patch for an older version line (for example,
mainalready contains work for the next major/minor).
- Use
-
Update the changelog + readme.
- Rename
[Unreleased]in the rootCHANGELOG.mdto## [X.Y.Z] YYYY-MM-DD. - Only edit the root
CHANGELOG.md - For features that ship in this release, remove their
🧪badges in the rootREADME.md(see Marking Pre-Release-Only Features).
- Rename
-
Update screenshots (feature releases). In the same PR as the
🧪badge removal, refresh the versioned image folder and switch all references — see Screenshot & Image Policy. -
Update the docs announcement bar. Bump the version in the
announcementBarcontent inlana-docs/docusaurus.config.ts(e.g.v1.18→v1.20) so the docs site advertises the new release. -
Bump the version. Set
versioninlana/package.jsonto the new stable version. Use the next even minor (1.18.x→1.20.0) for a feature release, or a patch bump (1.18.1→1.18.2) for a fix-only release. Commit these changes to the selected release branch. -
Create a GitHub Release. Tag the release with a name that exactly equals the
lana/package.jsonversion (e.g.1.20.0).⚠️ Gotcha:.github/workflows/publish.ymlpackageslana-<package.json version>.vsixbut publisheslana-${tag_name}.vsix. If the tag name and thepackage.jsonversion don't match, the publish step fails because the.vsixfilename won't exist. Novprefix — use1.20.0, notv1.20.0. -
Publish runs automatically.
publish.ymlfires on the releasepublishedevent, packages the extension, and publishes the stable build to the VS Code Marketplace and Open VSX.
All README and docs screenshots live in a versioned folder, lana/assets/X_Y/ (the current
stable minor), and are hotlinked everywhere via absolute
https://raw.githubusercontent.com/certinia/debug-log-analyzer/main/lana/assets/X_Y/<file> URLs.
- Images show the stable release only. Pre-release features are described in text with a
🧪badge and get screenshots when they graduate — images switch in the same PR that removes the badges. - Always absolute
raw.githubusercontent.comURLs, never relative paths.vscerewrites relative README paths to absolute branch-pinned URLs at package time anyway, the images are excluded from the.vsix(lana/.vscodeignore), and the Docusaurus social-card (image:frontmatter) URLs must be absolute. Useraw.githubusercontent.com/..., notgithub.com/.../blob/...(the latter is an HTML page, not the image). - Keep filenames stable across versions so the switch is a pure folder-name find/replace.
lana/assets/<new>/holds the complete set every release — re-shot images and copies of any unchanged ones. Copy unchanged images forward (don't leave them in the old folder and point the new README at the old path): a byte-identical copy costs nothing in git (blobs are stored by content hash, so only a tiny tree entry is added), and it keeps every URL on one version string so deleting the old folder never breaks anything.
At each stable feature release:
- Create
lana/assets/<new>/with the full screenshot set — re-capture the views that changed, copy unchanged images forward unchanged, and add any new assets for graduating features. Capture inside real VS Code (so the webview's--vscode-*theme styling is correct), dark theme, a consistent window size. Use a rich sample log such assample-app/debug-logs/sample-log.log. - Find/replace
assets/<old>→assets/<new>across:- root
README.md(notlana/README.md— it's a generated copy) lana-docs/docs/docs/**/*.md(body references andimage:frontmatter)lana-docs/src/pages/index.mdxlana-docs/docusaurus.config.ts(social card image)
- root
- Delete
lana/assets/<old>/. The Marketplace only shows the latest README, so dropping old folders is safe; the only loss is images in tag-pinned READMEs on GitHub. - Verify:
grep -rn "<old>" README.md lana-docs/returns nothing, and the hero GIF still autoplays/loops in the GitHub README preview.
VS Code Marketplace always shows the README and CHANGELOG from the highest published version. There is no separate stable/pre-release README. Because pre-releases usually have a higher odd minor, the public Marketplace page may show pre-release docs. See microsoft/vscode#163477.
Practical consequences:
- Keep the README channel-neutral.
- Treat root
README.md,CHANGELOG.md, andLICENSE.txtas the source of truth. Do not hand-edit the generatedlana/copies.
Because the public README can show pre-release content to stable users (see above), mark pre-release-only features clearly so stable users aren't misled about what they can use today. Add the marker in the same PR that introduces the feature (the PR template has a checklist reminder).
The README uses a compact inline badge so deeply nested feature lists stay readable. The legend is defined once near the top:
> 🧪 **Pre-Release only** — available in the [Pre-Release Version](#-try-the-pre-release-version); not yet in the stable release.Then append 🧪 at the smallest accurate scope:
- Whole feature/section is pre-release → on the section heading (e.g.
## 📄 Raw Log Navigation 🧪). - A single bullet is pre-release → at the end of that bullet.
- Only part of a bullet → right after the specific phrase (e.g.
… or Caller Namespace 🧪, or Query).
When a feature graduates to stable, removing its 🧪 badge is part of the stable release
checklist (step 1 above).