Releasing
The website
The website (landing page and these docs) is an Astro + Starlight project in site/. It reads the docs straight from the repository’s docs/ folder, so a docs change on main updates the site.
pnpm installpnpm --filter echo-site dev # http://localhost:4321pnpm --filter echo-site build # astro check + static build into site/distThe build fails on broken internal links (starlight-links-validator). Repository-relative links in the docs, such as install.md#updating or ../scripts/setup.sh, are rewritten to site routes or GitHub links by site/src/plugins/remark-repo-links.ts.
Vercel setup
The site is a static Astro build deployed by Vercel’s Git integration. Its settings are in site/vercel.json: build commands, trailing slashes, and the security headers (CSP, HSTS and others). No Vercel secrets live in GitHub.
- In Vercel, choose Add New → Project and import
samarthmn/echo-voice-web. - Set the Root Directory to
site, and keep Include files outside the root directory in the Build Step enabled: the site readsdocs/,brand/,public/fonts/andscripts/from the repository root. - Leave the framework, install and build settings to
site/vercel.json(Astro; outputdist). It runs the repository’s pinned pnpm (12.11.2) throughnpxfor install and build, because Vercel’s bundled pnpm cannot switch itself to pnpm 12. Keep that version in step withpackageManagerinpackage.json. - Under Settings → General, choose Node.js 22 or newer.
- Under Settings → Domains, add
echo-web.samarthmn.comand create the DNS record Vercel shows. - Under Analytics, enable Web Analytics. Builds on Vercel then include its cookieless script, served from the site’s own
/_vercel/insightspath. Analytics only ever run on the website, never in the app.
Pushes to main deploy to production; other branches and pull requests get preview URLs.
Releasing a version
Echo has one version number, [workspace.package] version in Cargo.toml. scripts/version.ts copies it into package.json, extension/manifest.json and Cargo.lock, and check.sh --lint fails if they drift.
-
Move the
Unreleasednotes inCHANGELOG.mdunder a new## [X.Y.Z] - YYYY-MM-DDheading, and update the links at the bottom. -
Set the version everywhere:
Terminal window node scripts/version.ts X.Y.Z -
Re-check the competitor facts on the landing page (
site/src/data/site.ts, with the “checked” date) and update them if they have changed. -
Run
./scripts/check.sh --all, commit, and merge tomain. -
Tag the merge commit and push the tag:
Terminal window git tag vX.Y.Zgit push origin vX.Y.Z
The Release workflow (.github/workflows/release.yml) checks that the tag matches the version, runs the Rust and app checks on macOS, builds the unpacked extension zip and the Chrome Web Store zip, writes SHA256SUMS.txt, and publishes a GitHub release whose notes are that version’s CHANGELOG section.
For the Chrome Web Store, upload the store zip from the release as described in the store listing.