Bloat scorecard

What's actually used vs. over-built — the honest layer under PROJECTS.md.

✓ Actioned 2026-06-11. All four recommendations below were executed: rssdigest + orphan pages deleted; ingest-score scheduled daily and a poll run (email now populated); locascout + netscan archived (~3.8k LOC, recoverable in git); the legacy text digest retired and the briefing switched to Todoist for tasks. The scorecard below records the pre-cleanup state.
The spine is healthy and lean; the bloat is at the leaves. Of ~17,300 lines, the core (bridge + hub + report pipeline + shared client, ≈7,500 LOC) all earns its keep. About 3,800 LOC — 22% — is speculative: two heavyweight tools (locascout, netscan) that nothing consumes automatically. The most urgent issue isn't bloat, it's stale state: four signal domains are empty, so the headline pages currently render blank.

Verdict by component

ComponentLOCVerdictWhy
external-command-bridge4592active-coreThe deterministic core. Everything hangs off its one-file registry.
local-ingest (signalstore)1465active-coreThe signal hub — every report reads it. The spine.
local-report885active-coreLLM → HTML → Cloudflare. 3 pages auto-build daily.
_lib103active-coreShared Claude client, 4 importers. Only gap: no tests.
local-uptime1020active-nicheWired + consumed 3 ways. Needs endpoints added to matter.
local-jot495overlapsNotes + todos. Todos duplicate Todoist (see #4).
local-accountability668new · unprovenFully wired Jun 11; 0 rows in the hub yet.
local-fastmail464new · no dataWired; needs FASTMAIL_API_TOKEN + a poll.
local-todoist188new · no dataWired; needs TODOIST_API_TOKEN + a poll.
local-fitness1823heavyweight1823 LOC for one consumer (its own page). Works.
local-weather1869over-engineered10 modules for a 2-city forecast. Consumed, just heavy.
local-netscan1797speculativeOnly the legacy digest's one diff line reads it. Not scheduled.
local-locascout2001biggest bloatManual-only; its page is unscheduled; data stale since Jun 9.
local-rssdigest0deadRetired in git; only stale venv/ cruft on disk.

Where the lines live

~17,300 LOC total. Green = core, orange = heavy-but-used, red = speculative.

core (bridge + hub + report + lib)7,045
active leaves (uptime, jot, fastmail, todoist, accountability)2,835
heavy-but-used (weather, fitness)3,692
speculative (locascout, netscan)3,798

Bloat findings, ranked

  1. locascout (2001 LOC) — highest cost-to-use ratio. Manual !job scout only; its relocation-board page is never scheduled; the data it feeds has been stale since Jun 9.
  2. netscan (1797 LOC, 49 tests) — no signal, no page, not scheduled. Its only reader is the legacy digest's one "▲/▼" line.
  3. Legacy text digest duplicates weather/uptime/notes/news the pages already render — and is netscan's only consumer. Retiring it collapses two items.
  4. Task triplication — jot-todos vs. Todoist vs. accountability all feed "what to do." Pick one for the briefing.
  5. Orphan outputdashboard.html + neighborhoods.html have no spec; attention/relocation-board/fitness specs are never scheduled.
  6. rssdigest + committed venv/ dirs — filesystem cruft to delete/gitignore.

Not bloat — stale state (fix first)

Do this, in order

  1. Free wins: delete local-rssdigest/ + the two orphan HTMLs; gitignore */venv/; add accountability to PROJECTS.md.
  2. Cheap correctness: schedule ingest-score; set the Fastmail/Todoist tokens and run one poll (else 3 pages stay empty).
  3. The real call: archive locascout + netscan (≈3.8k LOC) unless you're actively relocating / LAN-watching — or schedule them so they produce. Don't leave them half-wired.
  4. Then: retire the legacy text digest (removes netscan's last consumer + the weather double-fetch); pick Todoist or jot-todos for the briefing.