Skip to content

v0.6.0 — push notifications, PDF packets, onboarding

Choose a tag to compare

@siaginw siaginw released this 04 Sep 22:25
· 3 commits to main since this release

SheetDiff v0.6.0 — push notifications, PDF packets, and a real onboarding flow

Eight researched integrations from the recommendations pass, each one vetted to actually fit before it shipped — plus the onboarding and settings work to make them discoverable.

The instant lane: push notifications

Settings → Push notifications. Subscribe to any topic in the ntfy app (or a browser), paste the topic URL, hit the built-in Send a test button. From then on, every capture that finds new work to enter buzzes your phone — the first capture of a sheet stays quiet (it's just a baseline), and quiet captures never ping. Validated http(s) URLs only, 5-second timeout, and a push failure can never fail a capture. Self-hosted ntfy servers work identically if nothing should leave the LAN.

The billing-day packet, now also a PDF

The billing page gains a PDF button next to CSV — a printable, fileable artifact for the invoice batch. It's built from the same packet assembly as the CSV (extracted into one shared source) on the same data clock, so the two can never disagree, and both are byte-identical on re-export.

Settings hub + getting-started checklist

All user-level settings now live on one /settings page (push, digest email, server-settings pointers), linked from the account menu. And the dashboard gained a four-step onboarding card — track a sheet → mark a collection point → turn on notifications → share with your collector — whose completion is derived from the database, never stored, so it can't drift out of sync with reality. It disappears when you're done (or when you dismiss it).

Under the hood

  • Temporal date math: parseCompletedDate now validates through Temporal.PlainDate — an impossible calendar date throws instead of relying on hand-rolled day-count checks, making the "Feb 30 became Mar 2" bug class structurally impossible. Week bucketing computes Mondays with Temporal day arithmetic, killing the DST-crossing drift the millisecond subtraction could produce. All output contracts unchanged; all existing tests untouched.
  • Pino structured logging with token redaction replaces every server-side console.log — greppable JSON in docker logs, level via LOG_LEVEL.
  • MSW wire-path tests for the real Google client: range quoting, 10-range chunking, response pairing, the reordered-response abort, and empty-grid handling now have actual coverage instead of a module mock that bypassed all of it.
  • Recharts bar chart for weekly footage on the report page — same deduped numbers, actually drawn.
  • README gained a Notifications & monitoring guide: ntfy setup, capture monitoring via Uptime Kuma or healthchecks.io (works with the existing HEALTHCHECK_PING_URL today), and a Litestream disaster-recovery compose recipe for continuous SQLite replication.

381 tests + 7 E2E, all green in CI. Node 22+.