- .lead .hero.noimg: faint giant 'BAM' watermark so a photoless lead
(most Bing-wire stories) never reads as a dead dark void.
- tests/ui-check.mjs: headless Chromium suite (front, reader, board
post + render, desk view, mobile) with a seeded scratch Mongo.
- Fixed board rate-limit to compare BSON Date against Date (a numeric
epoch matched nothing, so the counter stayed 0) — caught by
tests/board-test.mjs.
- Fixed /api/health double-await: getDb() is async, so
'await getDb().command(...)' called .command on the Promise. Caught
by tests/e2e-run.mjs.
Forked from Forthena (PERSONAL/forthena) and retargeted:
- NO login, NO LLM: the edition is public and the ranking is deterministic
(stories that name Sen. BAM lead; freshest first) — Daniel: no
like/dislike or store profile for visitors.
- Crawler scoped to BAM: Bing news keyword queries + Inquirer/Rappler
fallback wires, with a two-tier relevance gate (named-BAM always;
Aquino+legislative-context only from fallback) so op-eds and non-Bam
senators are dropped.
- Desks: BAM (lead), Gaming, Education, Politics, Energy, PH, Business.
- Community board /board: 'Thank you Senator BAM' — nickname-only posts,
HTML-stripped, URL-only rejected, IP rate-limited (3/10min, 20/day).
- Yellow-gamer theme (Orbitron/Rajdhani/JetBrains Mono, dark + gold,
HUD corners), supporter disclaimer in header and footer.
- Tests: category/date/relevance/text suites + Mongo board suite +
full HTTP e2e (all passing).
Infra: 66.181.46.132 (bidaangmamamayan.com), local Mongo 7.0,
nginx + certbot TLS, PM2 bama (:3000) + 15-min crawl cron.