Venicee

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:

  1. Push to the production branch, or run the Release Windows workflow manually.
  2. GitHub Actions builds the Windows zip, generates checksums.txt, and uploads everything to R2.
  3. The workflow overwrites releases/latest.json with 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:

VariableDescription
PUBLIC_RELEASE_MANIFEST_URLhttps://downloads.venicee.app/releases/latest.json
REVALIDATE_SECRETSecret for on-demand CDN cache purge
CLOUDFLARE_ZONE_IDZone ID for venicee.app (cache purge)
CLOUDFLARE_API_TOKENAPI 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:

SecretValue
WEBSITE_URLYour deployed site URL (no trailing slash)
REVALIDATE_SECRETSame 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:

  1. Reads the published version from releases/latest.json (or a manual workflow_dispatch input)
  2. Takes release notes from CHANGELOG.md, a GitHub Release body, or a manual input
  3. Prepends an entry to src/content/changelog/<locale>/intro.md via scripts/update-release-log.py
  4. Commits and pushes to the website repo
  5. Calls POST /api/revalidate so the new manifest appears immediately

App repository secrets

SecretValue
WEBSITE_REPO_TOKENFine-grained PAT with Contents: Read and write on venicee-website
WEBSITE_URLYour deployed site URL (no trailing slash)
REVALIDATE_SECRETSame value as on Cloudflare Pages

Optional app repository variables

VariableDefaultDescription
WEBSITE_REPOismael-wittwer/venicee-websiteWebsite repository
WEBSITE_BRANCHmainBranch Cloudflare Pages deploys
RELEASE_LOG_LOCALESenComma-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.