Skip to main content

Changelog

Release history

Only implemented releases belong here. Historical build plans are kept separately and marked as superseded.

0.4.3 three insights cards were answering for the wrong range

The insights page carries a date-range picker and a heading that names the selected range, and three of its six cards ignored both: coding-agent activity, deep-work sessions, and limit and retry events queried without any date predicate, so they printed lifetime totals. On one account the same page said the busiest hour cell held no session starts, that the selected period contained none, and that coding-agent activity was one session with one prompt and five tools. Changing the range moved three cards and left three where they were, which reads as a broken filter. The window is now built once and applied to every card. No test could have found it, because each query was correct in isolation and returned exactly what it asked for; the defect was in what it asked, and it took reading all six cards on a rendered page with real imported data. The same card also printed "1 sessions" and "1 prompts". Alongside it: revoking a share now takes effect on the very next request, refusals from the API say what a cache may do with them, and a sentence on the AI access page shipped with its space missing, which is an upstream compiler defect this version of Next carries and which a new check now catches at source.

0.4.2 the footer links to the rest of the estate

The roster of sister apps was complete, listed on the site map and in the machine-readable files, and rendered in the footer not at all. The footer is the only thing on all 34 public pages, so in practice a reader who arrived on an article had no route to any other Novus app, while all eight of them linked here. The previous entry described adding Novus Striker to that roster as linking it, which is the mistake worth naming: a registry a page does not render is not a link, and only reading the built page can tell those two states apart. Every sister app is now a plain anchor in the footer, driven off the roster so the two cannot drift, with a test that fails if a URL is ever typed into the markup instead.

0.4.1 signed-in accessibility and honest review dates

The two file pickers on the import screen sat in the accessibility tree with no name at all, so a screen reader announced two identical anonymous upload controls and neither one said which took a folder; both now carry a label. The signed-in pages had no main landmark and no skip link, which the public pages have always had. A keyboard visitor had to tab the whole header and both navs to reach the page. Every documentation and tutorial card printed its review date as a raw machine timestamp, and because that timestamp was midnight UTC it named the previous day for every reader west of Greenwich; dates are now the day the author wrote, on the page, in the markup, and in the machine-readable feeds. The security page's device list showed times that changed as the page finished loading, and now states them once, in UTC, and says so. Novus Striker joins the roster of sister apps, which was the last live Novus site missing from it.

0.4.0 accessibility pass

A browser drove all 34 public routes at desktop and phone width. Twelve footer controls that appear on every page were 20px tall, under the 24 by 24 CSS pixel minimum, and accounted for 408 of the 512 findings on their own. Link and tooltip accents moved to shades that pass AA on a light background, where cyan measured 3.35:1. The result is zero errors and, of the sixteen warnings left, all sixteen are this site writing the word null in prose about null values.

0.3.0 August 2026 pass

Dashboard comparison mode, saved views (migration 0007), public methodology centre, capability-matrix honesty, blog and docs expansion, editorial policy, and removal of the standalone GitHub CI workflow in favour of production-release.yml plus the recovery runbook.

0.2.0 production hardening

Moved roles into Better Auth, isolated owner controls, added manual recovery and session management, removed local-only claims, made exports complete, consent-gated analytics, and introduced the versioned seven-provider import protocol.

0.1.0 scaffold

Initial Next.js PWA foundation, authentication, import prototype, dashboard shell, public content, and sharing scaffold.

What counts as a release

A version appears here after the work is deployed and reachable in production. Plans, specifications, and half-finished branches do not get an entry, and an entry is never written in advance of the deploy. Build plans that were superseded are kept in the project documentation and marked as such rather than quietly rewritten, so it stays possible to see what was intended and what actually shipped.

That rule costs this page some length. It is short because the product is young, not because changes are being withheld. A release note that describes an unshipped feature is worse than no release note, because it makes every other line on the page unverifiable.

What 0.3.0 changed in practice

The August 2026 pass added the measurement surfaces the dashboard was missing, and the public writing that explains them without inventing numbers.

  • Comparison mode at /app/dashboard/compare: two URL-synced slices, deltas only when both sides are fully covered and share adapter, normalization, quality, source, and calculation. Blocked rows stay visible and name the gate.
  • Saved views: a name plus the six filter params, stored in dashboard_view (Drizzle migration 0007). Allow-listed on write and re-canonicalised on read. Cap of 20, no silent eviction.
  • Public /methodology centre, built from capability-matrix.ts, dashboard-sections.ts, and metric-methodology.ts rather than restated prose. Permanently blank metrics are computed, not remembered.
  • Two methodology posts, new compare doc and tutorial, /editorial-policy with Person JSON-LD, and W20 article furniture (TOC, prev/next, related, copy-link, local-only feedback).
  • GitHub Actions no longer runs a standalone ci.yml. production-release.yml remains the release workflow; recovery steps stay in docs/OPERATIONS.md.

What 0.2.0 changed in practice

The 0.2.0 pass was about removing claims the code could not back and closing the gaps that made the product unsafe to open to the public.

  • Roles moved into the authentication layer instead of being inferred, and owner-only controls were isolated behind their own checks rather than a hidden route.
  • Account recovery became an explicit, manually verified path. There is no public forgot-password form, and session management lets you see and revoke active sessions.
  • Local-only marketing claims were removed. Imports upload normalized statistics, so the honest description is stats-only, not local-only.
  • Data export was made complete rather than partial, so what leaves the product matches what it holds.
  • Analytics and advertising were placed behind consent, defaulting to denied, with a preferences surface for changing that decision later.
  • The import protocol was versioned across all seven supported providers so a format change becomes a visible warning instead of a silent metric shift.

What is not in a release yet

Two things are in progress and deliberately not claimed as shipped. Automated email verification is not built, which is why account recovery is manual today. And the planned provider adapters listed on the roadmap accept no files, because each one needs sanitized fixtures and a passing contract suite before its importer is enabled.

When either lands it will get a version entry here with the same standard applied: deployed, reachable, and described in terms of what changed for the person using it.

Versions follow semantic versioning loosely: the minor number moves when behaviour a user can observe changes. Documentation pages carry their own review dates, which is the better signal for whether a specific guide is current.