Repository navigation
Releases
v0.2.3: both enquiry limits read the same
DB rate limit answers as limited; use_case errorLabel; @profullstack/contact-form 0.3.2 (#260).
v0.2.2: @profullstack/contact-form 0.3.0
/sales enquiry form on 0.3.0; errors rebuilt from codes (#259).
v0.2.1: corpus enquiry form on @profullstack/contact-form
The /sales enquiry form and /api/sales/contact on @profullstack/contact-form 0.2.0 (#258).
v0.2.0: weekly newsletter + webring embed snippet
Weekly digest (opted in by default, one-click unsubscribe, Mondays 15:00 UTC) and copy-paste webring footer snippet (/api/v1/rings/embed, CLI rssamp ring embed, MCP ring_embed). Web 0.2.0, CLI 0.6.0.
v0.1.6
What's Changed
- feat(webring): Random link in the Profullstack ring footer by @ralyodio in #229
- feat(webring): anonymous, throttled votes for ring members by @ralyodio in #230
- feat(webring): vote page finds the site from the Referer too by @ralyodio in #231
- feat(footer): use @profullstack/footer by @ralyodio in #232
- fix: rate limits key on the real client address, not a forgeable header by @ralyodio in #233
- feat(footer): revalidate prerendered pages hourly (ISR) by @ralyodio in #234
- Rings: manage a ring you own with an API key by @ralyodio in #235
- No ads against the footer: drop or lift every foot banner by @ralyodio in #237
- pit.world global footer, trim the site footer by @ralyodio in #238
- Poller on @profullstack/scraper-daemon: one daemon, ten timers become jobs by @ralyodio in #236
- About, submit, discover: keep the closing ad off the footer by @ralyodio in #239
- Restore the @profullstack/footer webring row by @ralyodio in #240
- Poller daemon on BullMQ (scraper-daemon 0.2.1) by @ralyodio in #241
- x402-gateway 0.8.0: charge Lightpanda, headless, SEO resellers, stale UAs by @ralyodio in #242
- x402-gateway 0.9.0: never meter verified Applebot/Googlebot/bingbot; charge AI indexers by @ralyodio in #243
- x402-gateway 0.10.0: AI chat bots welcome, search engines verified by address by @ralyodio in #244
- deps: @profullstack/player 0.15.0 (caret on 0.3.1 never left 0.3.x) by @ralyodio in #245
Full Changelog: v0.1.5...v0.1.6
v0.1.5
- Corpus opt-out (feeds.dataset_opt_out) now also covers the reader and the MCP read_post tool: an opted-out publisher's page is framed or linked to, never extracted, cached or translated.
- New operator script packages/db/src/corpus-opt-out.js; remove-feed.js --restore lifts a removal made in error.
- Fix: feed, reader, view and author pages 404'd for every non-ASCII slug (Next 16 passes page params percent-encoded).
v0.1.4
The web server and the poller now run on Bun (#222, #223). RSSHub, embedded in the poller, stays on Node 24.
Measured on dev2 over 30 minutes: web latency is the same or better, with less CPU (27.5% → 23.8%) and fewer error lines (12 → 1); web memory is higher (881 → 1,266 MiB, stable). The poller uses less memory (351 → 263 MiB) and less CPU, and its crawl throughput and error rate are unchanged, with faster ticks (82 s → 72 s).
v0.1.3
Moves @profullstack/openprofile to 0.1.2 (from 0.1.0): normaliseUrl now reads a stray % as a literal instead of throwing URIError on a profile or feed link like https://ij.org/podcasts/%podcast-type%/ (profullstack/mynaposter#121). It also brings in 0.1.1's fix: a section written twice in an edited file keeps both copies. (#221)
v0.1.2
Fix: recycle a web worker that has grown past 768 MB (#220)
- Every minute, the web server's primary process checks each worker's resident memory. If a worker is over
WEB_WORKER_RSS_MB(default 768), the primary starts a replacement, waits until it is accepting connections, and then lets the old worker finish its requests and exit. If it hasn't exited after 30 s, it gets SIGTERM. - Only one worker is recycled at a time, and the pool never drops below its size.
- The startup log line now shows each worker's heap ceiling and the recycle threshold. Each recycle is logged as it happens.
Why: #219 limited the pool to 4 workers with 1 GB of heap each. That doesn't stop a worker's memory from creeping up with age. On dev2 a worker grew from ~400 MB at one day old to ~970 MB at six days. In a local A/B test, lowering the heap ceiling didn't change workers' resident memory. Recycling caps four workers at about 3 GB.
v0.1.1
Fix: bound the web container on a shared host (#219)
- The web service now runs 4 cluster workers by default instead of one per CPU (16 on dev2).
WEB_WORKERSstill overrides it (up to 16), andWEB_WORKERS=1still gives you a single process. - The heap is a fixed total budget,
WEB_HEAP_BUDGET_MB(default 4096), split between the workers: about 1 GB each at 4 workers. Before this, each worker's ceiling was a share of the host's 91 GB, which came to 3.5 GB each. - The Dockerfile's
NODE_OPTIONSheap ceiling drops from 12288 to 4096 MB. - The default in-flight ceiling is still 128 for the container, now 32 per worker.
Why: on dev2 the web container had grown to 11.7 GB. That filled the host's swap, and earlyoom started killing the shared Postgres.