oxfmt is a 0.x, so the ^0.42.0 caret never crossed a minor and it sat 21
minors behind. The reformat turned out to be tiny — 2 files:
- mcp.server.ts: a call collapses onto fewer lines
- rundown.utils.ts: quoted numeric-enum members lose their quotes.
`enum X { 'id' }` and `enum X { id }` compile to the same object, so
the `key in RegenerateWhitelist` check is unaffected.
Kept separate from the dependency commits so it can be ignored in blame.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWs1vf42msmoJ21ABvQMpm
@googleapis/sheets ^5.0.5 -> ^14.0.0 and google-auth-library ^9.4.2 ->
^10.5.0. No source changes: the sheets_v4 shapes used in sheets.utils.ts
and the OAuth2Client/Credentials usage in sheets.service.ts are unchanged.
google-auth-library lands on 10 rather than the latest 11 on purpose.
@googleapis/sheets@14 reaches google-auth-library through
googleapis-common@8, which pins exactly 10.5.0; asking for ^11 installs
both copies and OAuth2Client stops being assignable to itself
("separate declarations of a private property 'redirectUri'").
googleapis-common@9 moves to ^11, so this can go to 11 once a
@googleapis/sheets release depends on it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWs1vf42msmoJ21ABvQMpm
v9 splits useFullscreen into useFullscreenElement (ref-based) and
useFullscreenDocument. NavigationMenu never attached the ref, and v8's
useFullscreen fell back to document.documentElement in that case, so
useFullscreenDocument is a behaviourally identical swap.
Every other hook in use is unaffected. The one other breaking change —
useLocalStorage/useSessionStorage now return `T | undefined` when no
defaultValue is given — does not apply: all nine call sites pass one.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWs1vf42msmoJ21ABvQMpm
Bumps the exact-pinned deps, which caret ranges never pick up:
turbo, @playwright/test, @sentry/vite-plugin, vite-plugin-compression2,
react-icons, @base-ui/react, electron-builder, and the ts-essentials /
rimraf catalog entries. Plus dotenv ^16 -> ^17 (one consumer, `import
'dotenv/config'`) and wait-on ^7 -> ^9 (devDep, one CLI call).
No CI change needed for playwright: the workflow already derives its
browser cache key from `pnpm ls @playwright/test`.
Deliberately does NOT run a blanket `pnpm update -r`. Refreshing caret
drift pulls @types/express-serve-static-core 5.0.6 -> 5.1.3, which widens
`req.params` values to `string | string[]` and fails typecheck in 39
places across 8 routers. The widening is correct — express 5 can produce
array params — but adopting it is a source change of its own, and pnpm 11
cannot pin around it (overrides in package.json are silently ignored, and
the pnpm-workspace.yaml equivalent does not re-resolve).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWs1vf42msmoJ21ABvQMpm
oxlint was ranged ^1.57.0, so a routine `pnpm update` would have resolved
1.78.0 on its own — which declares `peerDependencies: { oxlint-tsgolint:
">=7.0.2001" }` against a root pin of ^0.17.4, breaking the --type-aware
lint every workspace runs. Move both together.
oxlint-tsgolint jumped from 0.25.0 to 7.0.2xxx to track the TypeScript-Go
version; 7.0.2001 lines up with the catalog's typescript 7.0.2.
Lint still passes with 0 errors. Warning counts rise (server 64 -> 129)
because the newer oxlint ships more rules; 64 of the 65 new server
warnings are vitest(require-mock-type-parameters) in test files.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWs1vf42msmoJ21ABvQMpm
vitest 4.0.17 declared `vite: ^6 || ^7`, so it pulled a second vite@7.3.1
into the install alongside the vite@8.0.1 the client builds with, meaning
tests transformed through a different vite than the build. vitest 4.1
widened the range to include ^8, collapsing both to a single vite@8.2.1.
Likewise the tree carried three esbuild copies (0.24.2 from the server,
0.25.5 via tsx, 0.27.4 via vite). vite 8 takes esbuild as a peer and
tsx 4.23 deps ~0.28, so aligning the server on ^0.28 leaves one copy.
Also pin @types/node to the catalog in the client and utils workspaces.
Neither declared it, so transitive @types/* packages resolved it to
25.4.0 and the client was type-checked against Node 25 typings while the
app ships on Node 22 (engines.node ~22).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWs1vf42msmoJ21ABvQMpm
* fix: issue where a count-to-end would lead to incorrect expected times
* fix: include add time in overtime when countToEnd
* fix: ui and server use same calculation for expected end
The server serves html/timer-legacy.html and html/login.html from disk
at runtime, relative to the bundled server. The Docker image copies
these files but the electron packaging did not, so the view 404ed in
all desktop distributions.
Additionally, AppImages mount at /tmp/.mount_*, a hidden directory.
Express sendFile refuses paths containing dot-segments by default
(returns 404 without touching disk), so the view failed on Linux even
with the file packaged. Allow dotfiles for this route; the request
path is fixed so no user input is affected.
The Stage Timer and PiP Timer views relied on `align-content: center` to
vertically center the timer digits inside `.timer-container`, which is a
plain block element. Aligning children of a block container via
`align-content` only works in Chromium 123+ (Firefox 125+, Safari 17.4+).
Embedded browsers such as vMix Browser Input (CEF V115) and other older
CEF/Chromium-based production tools ignore the property, so the digits
fall back to the top of the container while every other element renders
correctly.
Make `.timer-container` a real flex column and center with
`justify-content: center`, which is universally supported and matches the
centering approach used elsewhere in the codebase. The removed
`justify-self`/`align-self` were no-ops on a full-width flex item.
Fixes#2126
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014T6ENZ3r6JXZb1fpYw2oNY
Surface {{groupNow.*}} template variables (title, note, colour, times,
custom fields) in the automation template autocomplete so events inside a
group can reference their group. The runtime store already carries
groupNow, so substitution and filters worked already; this makes it
discoverable.
Extend the message-secondary action with an optional text field so an
automation can set the secondary message content, not just its source.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LZYPZVdZLWowU7DyzGkWyy