Files
paseo/packages/website
Mohamed Boudra c91948048b Lead each release with highlights in What's new, the website changelog and release notes (#9281)
Every release entry in CHANGELOG.md now leads with highlights: an unheaded
list above the first `###`. The app's What's new sheet, the website
changelog and the GitHub release body show the highlights and fold the
sections, the full record, behind one control. An entry without highlights
keeps its sections in view. docs/release.md carries the writing rules.

Installed apps fetch CHANGELOG.md from main and parse it with the parser
they shipped with, so the two heading rules are a compatibility surface:
`##` starts a release, `###` starts a section, and headings inside fenced
code are text. The app, website and release-script parsers now split an
entry the same way and each runs the shared cases in
scripts/test-support/changelog-structure.json. The release-script tests,
which no CI job ran before, are part of "Validate CI contracts".

Adds the 0.16.0-beta.1 entry (en and zh-CN) ahead of the release.
2026-11-10 17:44:57 +07:00
..

Paseo website

Plugin install counts

Clients report an install by resolving a plugin with X-Paseo-Install: 1 or ?intent=install, using /api/plugins/resolve/<owner>/<slug> or /plugins/<owner>/<slug>.json. Ordinary resolves do not count. These numbers measure install intent, not successful artifact installation or npm downloads.

The worker requires Cloudflare's CF-Connecting-IP header to count a report. It stores the plugin ID plus a SHA-256 hash of the IP in a WEBSITE_CACHE KV key with a one hour TTL, never the raw IP. An existing key skips the count; repeats do not extend the hour. Missing or empty IP headers do not count.

Accepted reports increment the existing all-time total and UTC daily buckets in WEBSITE_CACHE. Daily buckets retain 60 days and supply the website's seven-day and thirty-day rankings. /api/plugins/installs still returns plugin IDs mapped to all-time totals. The registry build reads that endpoint into the published plugin details and index; the website reads windowed counts from KV through its five-minute cache. Existing counts remain intact. The KV guard is advisory: concurrent requests and KV propagation are not serialized.