* fix(server): accept voice and model names from self-hosted speech servers features.voiceMode.tts.voice and TTS_VOICE were validated against the OpenAI voice catalog, so a server whose voices live under other names could not be configured at all: config.json failed to parse and an env var threw inside the speech config resolver, which config.ts calls without a catch, so the daemon refused to start. TTS_MODEL had the same problem for model ids the server serves itself. Both are free-form now, with model ids keeping their case because rosters use values like kokoro-v1:Q8_0. Regenerate the config JSON schema. * fix(server): send TTS voice names as written and keep the config schema current A self-hosted OpenAI-compatible server owns its voice ids and their case, so lowercasing the configured voice could turn a valid id into one the server does not know. Keep the published config schema in its existing form and change only the voice field. Co-authored-by: khimaros <me@khimaros.com> * fix(server): drop the TTS baseUrl from the init log The configured baseUrl can carry a token in its query string, and logging it is not needed to accept self-hosted voice and model names. * test(server): await bounded worktree fixture cleanup on Windows --------- Co-authored-by: khimaros <me@khimaros.com> Co-authored-by: paseo-bot[bot] <266920839+paseo-bot[bot]@users.noreply.github.com>
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.