A release entry now opens with a short list of highlights above its first section. The What's new sheet, the website changelog and the GitHub release body show those and keep the sections, the full record, behind one control, so a 100-bullet release reads as ten lines. CHANGELOG.md stays plain Markdown because the app and the website render it without HTML, including apps already installed. Each surface folds the sections itself; only the release body gets a <details> block, written by Release Notes Sync. A release with nothing before its first section shows its sections as before. Adds the 0.16.0-beta.1 entry in the new format, with its Chinese translation, and the highlight writing rules in docs/release.md.
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.