Releases
The download page reads the latest release manifest from Cloudflare R2 (releases/latest.json) and links to the official CDN. The website does not host binaries itself.
Publish a release
Releases are built and uploaded from the app repository:
- Push to the
productionbranch, or run the Release Windows workflow manually. - GitHub Actions builds the Windows zip, generates
checksums.txt, and uploads everything to R2. - The workflow overwrites
releases/latest.jsonwith version, download URL, and SHA-256.
After publishing, /download shows the latest version and download link.
Website configuration
Set these environment variables locally (.env) and on Cloudflare Pages:
| Variable | Description |
|---|---|
PUBLIC_RELEASE_MANIFEST_URL | https://downloads.venicee.app/releases/latest.json |
REVALIDATE_SECRET | Secret for on-demand CDN cache purge |
CLOUDFLARE_ZONE_ID | Zone ID for venicee.app (cache purge) |
CLOUDFLARE_API_TOKEN | API token with Cache Purge permission |
The download page is CDN-cached for 60 seconds. For immediate updates after a release, call the revalidate endpoint:
curl -X POST https://venicee.app/api/revalidate -H "Content-Type: application/json" -d '{"secret":"YOUR_REVALIDATE_SECRET"}' Automate cache refresh
Copy scripts/revalidate-website.workflow.yml into the product repository as .github/workflows/revalidate-website.yml. Set repository secrets:
| Secret | Value |
|---|---|
WEBSITE_URL | Your deployed site URL (no trailing slash) |
REVALIDATE_SECRET | Same value as on Cloudflare Pages |
The workflow runs after the Windows release workflow completes and refreshes /download.
Automate the release log
The download manifest updates when R2 is uploaded, but release notes are baked into the static site at build time. Purging the CDN is not enough — the app workflow must commit to the website repository (which triggers a Cloudflare Pages deploy).
Copy scripts/post-release-website.workflow.yml into the product repository as .github/workflows/post-release-website.yml. It runs after Release Windows and:
- Reads the published version from
releases/latest.json(or a manualworkflow_dispatchinput) - Takes release notes from
CHANGELOG.md, a GitHub Release body, or a manual input - Prepends an entry to
src/content/changelog/<locale>/intro.mdviascripts/update-release-log.py - Commits and pushes to the website repo
- Calls
POST /api/revalidateso the new manifest appears immediately
App repository secrets
| Secret | Value |
|---|---|
WEBSITE_REPO_TOKEN | Fine-grained PAT with Contents: Read and write on venicee-website |
WEBSITE_URL | Your deployed site URL (no trailing slash) |
REVALIDATE_SECRET | Same value as on Cloudflare Pages |
Optional app repository variables
| Variable | Default | Description |
|---|---|---|
WEBSITE_REPO | ismael-wittwer/venicee-website | Website repository |
WEBSITE_BRANCH | main | Branch Cloudflare Pages deploys |
RELEASE_LOG_LOCALES | en | Comma-separated locales to update (en,de,fr,it) |
CHANGELOG.md format
Use Keep a Changelog. The workflow reads the first section:
## [1.2.0] - 2026-06-16
### Added
- SFTP key authentication
### Fixed
- Connection timeout on slow networks Only the bullets under that heading are copied into the website release log. Translate de, fr, and it manually or set RELEASE_LOG_LOCALES once those files are ready.
Manual run
Actions → Post-release website → Run workflow to pass version and release_notes without a full release.
Release log (manual)
Release notes on the download page live in src/content/changelog/. You can still edit them by hand instead of using the workflow above. There is no automatic release history API yet — only the latest manifest on R2.