Repository navigation
What's Changed
- feat(desktop): compass:// deep links and OAuth relay end to end (WP-04) by @tyler-dane in #4203
- feat(backend): send welcome drip via Resend published templates by @tyler-dane in #4206
- feat(desktop): XCUITest staging URL and release launch smoke (WP-11) by @tyler-dane in #4207
- docs(desktop): WP-12 acceptance runbook and mac dev guides by @tyler-dane in #4208
- feat(backend): pass USER_FIRST_NAME in welcome drip Resend templates by @tyler-dane in #4209
- refactor: share welcome cta hrefs and desktop bridge schemas by @cursor[bot] in #4210
- fix(web): point personal onboarding CTA to Compass meet page by @tyler-dane in #4211
- fix(web): label straddling week by today's month by @tyler-dane in #4212
- feat(desktop): add sparkle auto-update with restart prompt by @tyler-dane in #4213
- feat(desktop): add unsigned sparkle dev channel by @tyler-dane in #4214
- feat(desktop): Sparkle auto-update for macOS (WP-05) by @tyler-dane in #4204
- docs(desktop): plan the native swift app and add desktop loop partitions by @tyler-dane in #4257
- fix(web): raise boot gzip ceiling for v1.3.7 staging builds by @tyler-dane in #4258
- docs(desktop): drop the staging smoke from the native plan by @tyler-dane in #4259
- feat(scripts): macOS swift-packages CI and verify mapping (WP-01) by @tyler-dane in #4260
- feat(core): move shortcut registry, keymap, and levels to packages/core by @tyler-dane in #4262
- fix(ci): align boot-size gate with cloud deploy and add gzip slack by @tyler-dane in #4265
- feat(billing): desktop Stripe return URLs, relay route, and PostHog config by @tyler-dane in #4267
- refactor: remove duplication and dead wiring from the desktop billing work by @tyler-dane in #4268
- refactor: simplicity audit cleanup by @tyler-dane in #4269
- test(backend): prove header sessions and bearer SSE for native clients by @tyler-dane in #4261
- feat(scripts): Swift contract generator from core Zod schemas (WP-02) by @tyler-dane in #4266
- fix(ci): skip unit and e2e for macos-only pull requests by @tyler-dane in #4271
- fix(e2e): aim timed slot clicks at visible main grid, not column th height by @tyler-dane in #4273
- feat(desktop-kit): CompassData API client, Keychain session, and SSE stream (WP-07) by @tyler-dane in #4270
- fix(sync): re-execute an identical update command instead of replaying it by @tyler-dane in #4275
- feat(scripts): desktop export for shortcuts, themes, events, and parity fixtures (WP-04) by @tyler-dane in #4272
- fix(web): let a focused calendar list own bare digits over typed-time create by @tyler-dane in #4276
- feat(desktop-kit): GRDB cache, repositories, range cache, and SSE invalidation (WP-08) by @tyler-dane in #4277
- test(scripts): complete WP-04 desktop export fixture coverage by @tyler-dane in #4278
- feat(desktop): native app skeleton behind COMPASS_NATIVE_UI (WP-09) by @tyler-dane in #4279
- feat(desktop-kit): CompassKit keyboard engine (WP-10) by @tyler-dane in #4280
- feat(desktop-kit): calendar math and timed deck layout in CompassKit (WP-11) by @tyler-dane in #4281
- feat(desktop-kit): recurrence rules in CompassKit with rrule parity (WP-12) by @tyler-dane in #4282
- feat(desktop-ui): TimeGridView week and day grid layout (WP-14) by @tyler-dane in #4284
- feat(desktop-kit): observable CompassData stores (WP-13) by @tyler-dane in #4283
- feat(desktop): native week/day grid with live SSE and demo fixtures (WP-15) by @tyler-dane in #4285
- feat(macos): shortcut levels, tips, and PostHog analytics (WP-24) by @tyler-dane in #4286
- feat(desktop): native notifications, Up Next, menu bar agenda, and Dock badge (WP-25) by @tyler-dane in #4288
- feat(desktop-ui): auth modal and AuthStore on Keychain session (WP-27) by @tyler-dane in #4289
- refactor: honor every test ignore pattern and share generated-file check by @cursor[bot] in #4292
- feat(desktop-ui): native billing gate, plan section, and hosted Stripe checkout (WP-30) by @tyler-dane in #4290
- feat(desktop): OAuth sign-in and calendar connections via ASWebAuthenticationSession (WP-28) by @tyler-dane in #4291
- refactor: pay down shim, duplication, and stringly-typed debt from last week by @tyler-dane in #4298
- feat(desktop-ui): native Life view (WP-34) by @tyler-dane in #4299
- feat(desktop-ui): grid focus, hold chips, and pointer hints (WP-16) by @tyler-dane in #4287
- refactor: share grid snapshot, oauth callback parse, and billing date parse by @cursor[bot] in #4305
- fix(web): dedupe optimistic this-and-following recurrence splits by @tyler-dane in #4306
- refactor: pay down duplication in the native desktop work from last week by @tyler-dane in #4310
- docs(auth): detail apple sign-in portal setup by @tyler-dane in #4312
- fix(sync): request caldav properties in their namespaces by @tyler-dane in #4315
- fix(web): start apple sign-in authorization by @tyler-dane in #4314
- fix(web): align auth signup styling and field shortcuts by @tyler-dane in #4313
- fix(sync): use correct XML namespaces in Apple CalDAV PROPFIND by @tyler-dane in #4316
- fix(web): trim apple authorization startup overhead by @tyler-dane in #4318
- refactor: share recurring occurrence patch and replace cache apply by @cursor[bot] in #4319
- fix(auth): accept apple form-post callback origin by @tyler-dane in #4320
- refactor(web): share the apple sign-in authorization intent store by @tyler-dane in #4322
- feat(desktop): anonymous demo seed and local-to-server sync (WP-31) by @tyler-dane in #4321
- feat(desktop): deep links, resume, feedback, and About for native UI by @tyler-dane in #4301
- refactor(web): weekly simplicity audit (auth relay cuts) by @tyler-dane in #4324
- feat(desktop-ui): draft create and keyboard placement (WP-17) by @tyler-dane in #4308
- feat(desktop-ui): native onboarding welcome, prompts, and gating (WP-32) by @tyler-dane in #4323
- feat(desktop-ui): native palette, legend, go-to-date, and shortcuts catalog (WP-23) by @tyler-dane in #4303
- feat(desktop): native quick-add panel on DraftStore (WP-26) by @tyler-dane in #4328
- feat(desktop-ui): native event form overlay with field jumps (WP-18) by @tyler-dane in #4327
- feat(desktop-ui): native settings shell, accounts, default calendar (WP-29a) by @tyler-dane in #4332
- fix(web): consistent sidebar-editing ring on week grid event cards by @tyler-dane in #4336
- fix(web): recover SSE live updates after server close with expired session by @tyler-dane in #4337
- refactor: share palette hits, draft persist, and card shadows by @cursor[bot] in #4338
- feat(desktop): native description editor with TipTap HTML subset (WP-21) by @tyler-dane in #4335
- feat(desktop-ui): settings timezone, time-travel grid, theme (WP-29b) by @tyler-dane in #4334
- feat(desktop-ui): launch at login and global quick-add hotkey (WP-29c) by @tyler-dane in #4340
- feat(desktop-ui): native attendees, RSVP, invitations, and schedule lock (WP-20) by @tyler-dane in #4339
- feat(desktop): native Block Party practice game (WP-33) by @tyler-dane in #4342
- feat(desktop-ui): native meeting settings and setup wizard (WP-35) by @tyler-dane in #4341
- feat(desktop): native-only UI, remove WebView shell and bridge by @tyler-dane in #4343
- feat(desktop-ui): native which-key, event menu, hide, clipboard, undo (WP-22) by @tyler-dane in #4330
- feat(macos): blocking calendar toggles for meeting settings by @tyler-dane in #4344
- feat(desktop): native Sparkle restart prompt and v1.0.0 release smoke (WP-39) by @tyler-dane in #4346
- refactor(web): remove WKWebView desktop shell from calendar-web by @tyler-dane in #4348
- feat(macos): booking connect prompt without healthy sync by @tyler-dane in #4349
- feat(macos): guest meeting setup handoff and resume by @tyler-dane in #4351
- feat(macos): booking status header and blocker notice by @tyler-dane in #4352
- feat(macos): recurrence editing and scope dialogs (WP-19) by @tyler-dane in #4333
- refactor: pay down export, sse, sanitizer, and native telemetry duplication by @tyler-dane in #4354
- feat(desktop): XCUITest demo flows and macOS snapshot workflow (WP-40) by @tyler-dane in #4353
- docs(desktop): native acceptance runbook and shipped spec (WP-41) by @tyler-dane in #4345
- fix(web): day view multi-calendar headers, tooltips, and Mod+digit jumps by @tyler-dane in #4356
- fix(macos): day view multi-calendar headers, Mod+digit jumps, horizontal scroll by @tyler-dane in #4357
- docs(agents): name desktop generator checks in verify section (WP-41 follow-up) by @tyler-dane in #4355
- refactor: share booking bindings, connect buttons, and day-column digits by @cursor[bot] in #4358
- feat(web): pulse today and now line when go-to-today is a no-op by @tyler-dane in #4359
- refactor: pay down now-cue, event card, and accessibility probe duplication by @tyler-dane in #4360
- fix(deploy): block production deploy until welcome email Resend config is set by @tyler-dane in #4362
- chore(deps): bump the minor-and-patch group with 15 updates by @dependabot[bot] in #4363
- chore(deps): bump express and @types/express by @dependabot[bot] in #4364
- chore(deps): bump mongodb-memory-server from 9.2.0 to 11.3.0 by @dependabot[bot] in #4367
- refactor: fold now-cue pulse into stores and share probe attach by @cursor[bot] in #4368
- refactor(web): pay down hint overlay, provider authorization, and day header duplication by @tyler-dane in #4369
- chore(security): weekly audit dep override and stripe webhook errors by @tyler-dane in #4325
- refactor: share stripe expandable ids and native auth outcomes by @cursor[bot] in #4370
- refactor: pay down native dialog chrome, fixture dead code, and callback failure paths by @tyler-dane in #4375
- feat(web): improve second timezone discoverability by @tyler-dane in #4376
- fix(web): clip day view calendar column header labels by @tyler-dane in #4378
- fix(web): sync Google popup reminders and fire event notifications reliably by @tyler-dane in #4377
- fix(web): disambiguate duplicate email day column labels by @tyler-dane in #4379
- fix(web): resolve ambiguous end times after start time by @tyler-dane in #4380
- feat(backend): founder welcome email preview loop by @tyler-dane in #4381
- fix(self-host): recreate backend when compass.yaml changes by @tyler-dane in #4382
- fix(e2e): pin browser clock for ambiguous time-picker spec by @tyler-dane in #4384
- refactor: share email matching and recent display helpers by @cursor[bot] in #4383
- refactor: pay down grid card chrome, notifier shims, and time-parse overload by @tyler-dane in #4385
- feat(web): accept flexible go-to date formats in command palette by @tyler-dane in #4386
- fix(web): align event form location and meet rows by @tyler-dane in #4387
- fix(web): align location and meet label text start by @tyler-dane in #4388
- fix(web): inset week focus ring in sidebar month picker by @tyler-dane in #4390
- fix(web): full-width primary Save in sidebar event form by @tyler-dane in #4391
- refactor: fold year-first date patterns and drop form-row test hook by @cursor[bot] in #4392
- refactor: pay down preview-loop reads, reminder re-export, and date-util loops by @tyler-dane in #4393
- fix(web): restore Cmd+Enter and Esc in event time pickers by @tyler-dane in #4395
- feat(shortcuts): flash jump keys on F, free H by @tyler-dane in #4396
- fix(web): advance welcome modal on Enter when dialog has focus by @tyler-dane in #4397
- test(web): pin altgr handling in hold-mod hint hook by @tyler-dane in #4398
- feat(email): daily welcome tip drip (day 0-4) mapped to new Resend templates by @tyler-dane in #4399
- fix(email): retire queued preview-loop rows from a retired step list by @tyler-dane in #4400
- refactor: drop leftover calendar skipIf and flash-jump residue by @cursor[bot] in #4402
- refactor: pay down date picker branches, timezone label, and welcome step math by @tyler-dane in #4403
- fix(billing): expire stale card-less local trials by @tyler-dane in #4394
- feat(email): 'Tyler from Compass' sender, no preheader, CTA_LABEL host text by @tyler-dane in #4404
- fix(desktop): match web layout, fonts, welcome modal, event form, and calendar list by @tyler-dane in #4401
- feat(desktop): header view switcher like the web by @tyler-dane in #4405
- Weekly security audit: transitive dep overrides (proxy-addr, seroval, prosemirror-view, source-map-js) by @tyler-dane in #4406
- refactor: code simplicity audit follow-ups (Oct 5–12) by @tyler-dane in #4407
- fix(deploy): invert production email.allowlist health check by @tyler-dane in #4408
- feat(email): reply-to tyler@keepsoftwaresimple.com on all outgoing emails by @tyler-dane in #4410
- fix(ci): production email health check and contact debouncer flake by @tyler-dane in #4409
- fix(macos): keep signed-out users in local mode on launch by @tyler-dane in #4411
- feat(macos): handle focus-sidebar, focus-notice, and subscribe shortcuts by @tyler-dane in #4418
- feat: location autocomplete in the event form (web places, macos mapkit) by @tyler-dane in #4419
- feat(macos): resizable sidebar that remembers its width and open state by @tyler-dane in #4420
- feat(web): hide iCloud CalDAV behind Other / iCloud link by @tyler-dane in #4426
- test(sync,e2e): mocked CalDAV connect and opt-in iCloud smoke by @tyler-dane in #4429
- fix(web): restore grid click shortcut hint and ignore PostHog dead gestures by @tyler-dane in #4428
- fix(scripts): give colliding swift contract enums distinct names by @tyler-dane in #4421
- feat(macos): sidebar sync status line and refresh button by @tyler-dane in #4430
- fix(web): pin prosemirror-model to a single version by @claude[bot] in #4434
- feat(macos): EventKit one-click iCloud calendar connect by @tyler-dane in #4427
- fix(macos): make contact suggestion debounce coalescing deterministic by @tyler-dane in #4435
- feat(macos): calendar list collapse, number-key picks, undo, and connect by @tyler-dane in #4436
- fix(macos): store collapsed account digests, not account emails by @tyler-dane in #4437
- style(macos): modal panels match the web's OverlayPanel by @tyler-dane in #4439
- fix(web): event form editor lists, save bar, and sticky actions by @tyler-dane in #4440
- fix(sync): record google sync handshake as push received by @tyler-dane in #4442
- fix(sync): heal unstamped Google push subscriptions by @tyler-dane in #4445
- test(e2e): pin browser clock for timed specs by @tyler-dane in #4446
- fix(web): refresh onboarding connect and trial copy by @tyler-dane in #4425
- refactor: share the debounced value hook and tighten grid gesture markers by @tyler-dane in #4447
- fix(web): fire local_mode_selected for This browser row by @tyler-dane in #4449
- fix(web): remove event form sidebar dividers and full-height border by @tyler-dane in #4450
- fix(web): space-between layout on event form save bar button by @tyler-dane in #4451
- fix(web): compact all-day row height on staging (non-prod) by @tyler-dane in #4453
- feat(web): staging event sidebar link copy and provider-managed fields by @tyler-dane in #4452
- feat(web): add date picker to timed event form schedule by @tyler-dane in #4454
- fix(web): past grid events darker and muted, not lighter by @tyler-dane in #4455
- refactor: flatten date pickers and share description-link copy by @cursor[bot] in #4456
- refactor: pay down the push-stamp heal sweep, provider-managed copy, link lookup, and a debounce literal by @tyler-dane in #4457
- fix(web): keep calendar grid aligned across US DST transitions by @tyler-dane in #4460
- feat(analytics): instrument OAuth signup drop-off in PostHog by @tyler-dane in #4459
- fix(web): apply Tyler-approved account-choice copy by @tyler-dane in #4462
- fix(web): raise boot gzip ceiling for v1.3.160 staging builds by @tyler-dane in #4463
- feat(ci): gate boot gzip on PR delta instead of deploy ceiling by @tyler-dane in #4466
- fix(ci): write boot metrics file at repo root on main by @tyler-dane in #4467
- fix(web): pulse today label text instead of clipped outline by @tyler-dane in #4468
- fix(deploy): build web image with its own deploy config, not boot-size placeholders by @tyler-dane in #4472
- refactor: share oauth callback analytics and civil hour-line walk by @cursor[bot] in #4474
- fix(web): restore go-to-today now-cue pulse on repeated t presses by @tyler-dane in #4475
- refactor(web): share the now-cue pulse subscription and flatten go-to-today by @tyler-dane in #4476
- refactor: drop the pass-through oauth state wrapper, dead apple decode, and a duplicated schedule literal by @tyler-dane in #4477
- fix(web): inherit Google reminder metadata and surface blocked notifications by @tyler-dane in #4479
- fix(scripts): pin utc for desktop export and use effective zone in life math by @tyler-dane in #4480
- fix(macos): open local mode on today and keep the time grid scrollable by @tyler-dane in #4481
- fix(macos): stop test probes and the e leader from eating typed titles by @tyler-dane in #4482
- fix(macos): keep event form title typing in the swiftui field by @tyler-dane in #4483
- fix(macos): polish legend glyphs, menus, window frame, copy and save errors by @tyler-dane in #4484
- fix(macos): bring the week grid and up next to web parity by @tyler-dane in #4485
- ci(macos): upload ui test screenshots and failure recordings by @tyler-dane in #4486
- fix(macos): fix launch focus, redo history, window menu and mini calendar by @tyler-dane in #4487
- feat(macos): add debug-only compass://debug shell commands by @tyler-dane in #4488
- fix(e2e): stabilize pointer-hint teaching pill a11y spec by @tyler-dane in #4489
- refactor: share notification banner subscription and drop unused skip reasons by @cursor[bot] in #4490
- refactor: collapse paired picker-open booleans and tidy boot-size cleanup by @tyler-dane in #4493
- fix(macos): align sidebar navigation and event editing with web by @tyler-dane in #4492
- feat(web): local-mode Google connect prompt after three events by @tyler-dane in #4501
- fix(deploy): write sync.postConnectRedirectUrl into generated compass.yaml by @tyler-dane in #4502
- fix(web): skip timed start date in event form tab order by @tyler-dane in #4504
- fix(macos): preserve rich descriptions and add formatting controls by @tyler-dane in #4495
- fix(macos): align the anonymous calendar row with web by @tyler-dane in #4497
- fix(macos): confirm calendar account disconnection by @tyler-dane in #4506
- fix(macos): add account actions and isolate native keyboard input by @tyler-dane in #4499
- fix(macos): edit multi-day all-day event date ranges by @tyler-dane in #4514
- fix(macos): fit event form panels and color controls to sidebar by @tyler-dane in #4512
- fix(macos): preserve explicit do not send invitation choice by @tyler-dane in #4516
- fix(macos): retain cached calendar ranges while offline by @tyler-dane in #4510
- fix(macos): restore event edits through undo and redo by @tyler-dane in #4508
- fix(macos): honor the preferred calendar for new events by @tyler-dane in #4518
- refactor: share anonymous write-count helpers and drop prompt scaffolding by @cursor[bot] in #4522
- fix(macos): use calendar timezone in native event date controls by @tyler-dane in #4520
- fix(macos): render and persist local recurring events by @tyler-dane in #4523
- fix(macos): preserve source timezone in event drafts by @tyler-dane in #4525
- fix(macos): restore offline calendars and discard removed caches by @tyler-dane in #4529
- fix(macos): make recurrence end dates valid and inclusive by @tyler-dane in #4527
- fix(macos): complete command palette actions and keyboard selection by @tyler-dane in #4531
- refactor: collapse the all-day row-fit pair and banner dismissal state by @tyler-dane in #4535
- fix(web): keyboard-first event form date field and stable time picker menu by @tyler-dane in #4540
- fix(web): repair event form time menu, date entry, and header spacing by @tyler-dane in #4541
- fix(web): make the go-to-today now cue visible in the light theme by @tyler-dane in #4542
- refactor: share form jump ids and drop unused palette item fields by @cursor[bot] in #4543
- fix(web): pulse the now cue whenever t lands with the now line on screen by @tyler-dane in #4544
- fix(web): play the now line pulse and label shimmer in sync by @tyler-dane in #4545
- fix(web): open event form date picker from keyboard by @tyler-dane in #4550
- fix(macos): navigate to remote palette search results by @tyler-dane in #4533
- fix(macos): preserve editor drafts during quick add by @tyler-dane in #4536
- fix(macos): fit command palette height to its results by @tyler-dane in #4538
- fix(macos): persist edits without unsupported calendar moves by @tyler-dane in #4549
- fix(web): dedupe duplicate holiday chips in week all-day row by @tyler-dane in #4553
- fix(macos): support keyboard sidebar resizing by @tyler-dane in #4555
- fix(macos): copy links from event descriptions by @tyler-dane in #4557
- fix(macos): preserve event details when duplicating by @tyler-dane in #4552
- fix(macos): enforce read-only event form access by @tyler-dane in #4559
- refactor(web): drop dead date field keyboard flags and share the duplicate-copy grouping pass by @tyler-dane in #4562
- fix(macos): encode occurrence request paths once by @tyler-dane in #4561
- fix(macos): pulse visible now cue when navigating to today by @tyler-dane in #4566
- feat(macos): add booked meeting management actions by @tyler-dane in #4564
- fix(macos): advance the grid clock during minute refresh by @tyler-dane in #4570
- fix(macos): submit guest email before saving the event form by @tyler-dane in #4568
- refactor(macos): drop dead duplicate path and share recent form helpers by @cursor[bot] in #4573
- fix(macos): render daylight-saving civil day rows by @tyler-dane in #4572
- fix(macos): give rsvp dialogs keyboard priority by @tyler-dane in #4575
- fix(macos): align calendar chrome and grid styling by @tyler-dane in #4577
- refactor(web): finish the picker-open collapse and drop five dead branches by @tyler-dane in #4580
- fix(macos): show time ranges on timed event cards by @tyler-dane in #4583
- fix(test): make browser parity verification portable on macos by @tyler-dane in #4584
- fix(macos): align life and sidebar datepicker styling by @tyler-dane in #4586
- fix(macos): separate event fills from calendar colors by @tyler-dane in #4579
- fix(sync): attribute oauth_callback PostHog events to users with reasons by @tyler-dane in #4588
- chore(deps): bump @stripe/react-stripe-js from 6.12.0 to 7.0.0 by @dependabot[bot] in #4470
- fix(web): simplify notification permission banner copy by @tyler-dane in #4590
- docs(desktop): web vs macOS parity checklist (#4331) by @tyler-dane in #4592
- fix(web): add notice shortcut to notification permission banner by @tyler-dane in #4598
- docs(desktop): visual parity evidence table (web CI, macOS pending) by @tyler-dane in #4606
- refactor(web): weekly simplicity audit (2026-10-19) by @tyler-dane in #4600
- fix(web): group event form guests with location and meet by @tyler-dane in #4599
- fix(desktop-ui): now line accent gradient and 700ms cue pulse by @tyler-dane in #4604
- fix(desktop-ui): Shift+day column jump, focus-event, and tip strip by @tyler-dane in #4605
- chore(desktop): web vs macOS parity screenshot pipeline by @tyler-dane in #4596
- fix(desktop-ui): command palette fuzzy search, highlights, and shadow by @tyler-dane in #4602
- fix(desktop-ui): native theme tokens, FormCard event form, and save bar by @tyler-dane in #4603
- fix(desktop-ui): event form logistics card matches web #4599 by @tyler-dane in #4607
- fix(desktop-ui): parity gaps from main compare (day jump, palette, checklist) by @tyler-dane in #4608
- fix(ci): align macOS and web parity capture geometry by @tyler-dane in #4609
- fix(desktop-ui): tighten event form density toward web FormCard by @tyler-dane in #4610
- fix(ci): apply parity capture geometry inside the app process by @tyler-dane in #4611
- fix(macos): Sunday week start and UTC timezone labels like web by @tyler-dane in #4612
- docs(desktop): refresh parity checklist for macOS batch #4612–#4614 by @tyler-dane in #4615
- fix(macos): palette, sidebar status, quick-time jump day, settings hint by @tyler-dane in #4613
- docs(desktop): refresh parity checklist after #4612 merge by @tyler-dane in #4616
- refactor: share oauth callback context and recent form helpers by @cursor[bot] in #4617
- fix(macos): parity week grid, expanded captures, and settings/banner chrome by @tyler-dane in #4619
- fix(macos): expand parity captures and align banners/settings chrome by @tyler-dane in #4620
- fix(macos): align event form layout with web sidebar by @tyler-dane in #4622
- fix(macos): parity grid scroll, settings chrome, and onboarding capture by @tyler-dane in #4623
- refactor(core): share the oauth state failure union and fold callback narrowing by @tyler-dane in #4624
- fix(macos): align command palette and event form schedule with web by @tyler-dane in #4625
- fix(macos): tune palette footer and parity modal crop geometry by @tyler-dane in #4626
- fix(web): split hard breaks before description list toggles by @tyler-dane in #4629
- fix(web): hide auth letter hints while typing in fields by @tyler-dane in #4632
- fix(web): unify anonymous explorer sign-up nudge after first engagement by @tyler-dane in #4633
- fix(web): align week grid event times across DST when timezone is pinned by @tyler-dane in #4634
- feat(web): make provider save failures obvious and recoverable by @tyler-dane in #4635
- fix(macos): match web overlay panel dialog styling and keys by @tyler-dane in #4641
- fix(web): group sidebar footer icons and clarify reload tooltip by @tyler-dane in #4638
- fix(macos): align day labels, mini-calendar, and unsettled cards with web by @tyler-dane in #4642
- fix(macos): match web settings field styling and action keys by @tyler-dane in #4644
- fix(sync): classify Google 400s, coalesce nudges, improve skip logging by @tyler-dane in #4646
- fix(macos): match web command palette sections, rows, and styling by @tyler-dane in #4639
- fix(macos): flatten event form cards to web FormCard layout by @tyler-dane in #4643
- feat(macos): unified title bar and parity title-bar reference capture by @tyler-dane in #4649
- fix(macos): add web notices, connection and timezone banners by @tyler-dane in #4640
- feat(web): event description link UX (hover, shortcuts, shortened display) by @tyler-dane in #4645
- fix(macos): command palette Phosphor icons for web parity by @tyler-dane in #4650
- fix(macos): replace the feedback alert with a web-style dialog by @tyler-dane in #4652
- fix(macos): use web's month grid for the form date picker by @tyler-dane in #4656
- fix(web): reserve inline space for description link keycaps by @tyler-dane in #4661
- refactor: share google rate-limit reasons and description-link helpers by @cursor[bot] in #4659
- ci(macos): stop spending macOS runner minutes on duplicate runs by @tyler-dane in #4663
- fix(macos): match web's Life quote and date of birth format by @tyler-dane in #4658
- feat(macos): add the Life date of birth calendar with a year picker by @tyler-dane in #4662
- fix(web): Denver fall-back week grid alignment (Nov 2026) by @tyler-dane in #4637
- fix(macos): draw Phosphor icon arcs as curves, not straight lines by @tyler-dane in #4664
- fix(macos): match web's Mod+digit page jump targets by @tyler-dane in #4666
- fix(parity): get the web vs macOS parity workflow passing again by @tyler-dane in #4665
- feat(macos): description link host labels and open shortcuts by @tyler-dane in #4660
- refactor: collapse four repetitions from the last week of merges by @tyler-dane in #4669
- fix(parity): harden Desktop web parity title bar capture on macOS CI by @tyler-dane in #4668
- fix(macos): align week-grid parity scroll and gutter with web by @tyler-dane in #4657
- fix(parity): week-grid capture setup on main after #4657 by @tyler-dane in #4671
- fix(web): strip OAuth callback URL params and ignore stale replays by @tyler-dane in #4673
- fix(web): name provider in provider-managed schedule note by @tyler-dane in #4674
- feat(web): gate edit-sequence menu items by event context by @tyler-dane in #4678
- test(web): cover stale Google OAuth callback replay paths by @tyler-dane in #4680
- fix(macos): add description placeholder and draft delete like web by @tyler-dane in #4654
- feat(web): make first-event prompt actionable with primary CTA by @tyler-dane in #4681
- fix(web): center auth switch pill when letter hint is hidden by @tyler-dane in #4683
- fix(web): keep recurring splits correct under rapid this-and-following edits by @tyler-dane in #4687
- feat(web): reorganize meet settings blocking calendars by @tyler-dane in #4677
- feat(web): event form copy meeting link shortcut and keyboard audit by @tyler-dane in #4679
- fix(web): week timed events align with gutter labels and columns by @tyler-dane in #4686
- fix(macos): show hold-mod day jump keycaps on week headers like web by @tyler-dane in #4688
- feat(macos): gate edit-sequence menu by event context by @tyler-dane in #4682
- fix(web): remove layout gap under collapsed blocking calendar groups by @tyler-dane in #4692
- fix(web): align week gutter labels with timed rows and events by @tyler-dane in #4696
- fix(macos): show hold-mod chips on the month picker and up next like web by @tyler-dane in #4694
- feat(web): event form date, time, and color keyboard hints (#4675) by @tyler-dane in #4698
- fix(sync): denormalize credentialUsable to cut sweep query targeting by @tyler-dane in #4699
- fix(macos): pin hold-mod chips to the anchor corner like web by @tyler-dane in #4700
- feat(macos): number each connected account as a page jump target like web by @tyler-dane in #4701
- fix(web): lead welcome screen 3 with Google free trial primary by @tyler-dane in #4702
- fix(web): align Up Next card with grid event visibility by @tyler-dane in #4690
- feat(macos): event form copy meeting link (Mod+Shift+L) parity by @tyler-dane in #4691
- fix(web): align month picker month nav with Mod+Alt+Shift J/K by @tyler-dane in #4693
- feat(macos): label event jump chips by day like web (w1, su2) by @tyler-dane in #4705
- feat(web): one-time Life view intro modal by @tyler-dane in #4685
- feat(macos): show the mod+6 color jump hint like web by @tyler-dane in #4706
- refactor: collapse event-form visibility and oauth-callback leftovers by @cursor[bot] in #4711
- fix(web): tidy welcome screen 3 footer and trial copy by @tyler-dane in #4707
- fix(macos): let the color swatch grid fill the row beside the hint by @tyler-dane in #4708
- feat(macos): take bare day letters in event jump mode like web by @tyler-dane in #4710
- fix(macos): read day jump keycap weekdays in a fixed utc calendar by @tyler-dane in #4712
- feat(macos): create at a typed time on the jump-picked day like web by @tyler-dane in #4716
- fix(web): suppress welcome on meet paths and tighten PostHog funnel by @tyler-dane in #4722
- fix(web): safe back navigation on signup trial step by @tyler-dane in #4713
- feat(macos): move between color swatches with arrows and pick keys like web by @tyler-dane in #4714
- fix(macos): name welcome buttons by their title, not title plus keycap by @tyler-dane in #4720
- fix(macos): open the event form time list on the selected time like web by @tyler-dane in #4721
- fix(web): lowercase event jump labels and bare f4 targeting by @tyler-dane in #4723
- fix(parity): draw popover windows into macos parity captures by @tyler-dane in #4717
- fix(web): cap month picker nav at Mod+Alt+J/K (three keys) by @tyler-dane in #4715
- fix(macos): put hour gutter labels on the 1 am track origin like web by @tyler-dane in #4719
- fix(macos): register the welcome account-choice parity surface by @tyler-dane in #4724
- fix(macos): order color swatches like web and fill the time list popover by @tyler-dane in #4725
- fix(macos): use web's light panel backdrop and center the welcome panel by @tyler-dane in #4718
- docs(macos): refresh parity checklist from the latest compare by @tyler-dane in #4728
- fix(web): polish signup trial step layout and copy by @tyler-dane in #4727
- feat(macos): open and nudge the form date field from the keyboard like web by @tyler-dane in #4729
- fix(web): left-align signup trial terms with title by @tyler-dane in #4730
- feat(macos): move a day cursor in the open form calendar with arrow keys by @tyler-dane in #4731
- fix(web): single Stripe submit on signup trial step by @tyler-dane in #4732
- feat(macos): show the form date field key hints like web by @tyler-dane in #4733
- feat(macos): lowercase day-prefix event jump parity with web by @tyler-dane in #4726
- fix(macos): show the word Enter in the form key hints like web by @tyler-dane in #4735
- refactor: drop dead event-form and billing-contract code by @tyler-dane in #4736
- docs(macos): reconcile implemented parity checklist entries by @tyler-dane in #4738
- fix(web,macos): month picker Go to this month uses Mod+Alt+T by @tyler-dane in #4739
- feat(booking): simplify /meet landing and improve SEO by @tyler-dane in #4740
- feat(web,macos): context-aware form footer tips and Mod+Alt+A all-day toggle by @tyler-dane in #4742
- feat(web, macos): day view columns only for calendars with visible events by @tyler-dane in #4741
- feat(backend): server oauth_callback for Google sign-in OAuth redirects by @tyler-dane in #4744
- fix(booking): bake PostHog into booking-web deploy images by @tyler-dane in #4743
- feat(web,macos): move shortcut level badge to sidebar footer by @tyler-dane in #4745
- fix(web): relay OAuth callback telemetry via /api/auth route by @tyler-dane in #4746
- feat(web): empty-grid click shortcut hints and macOS parity by @tyler-dane in #4747
- fix(web): share PostHog client across booking-web code splits by @tyler-dane in #4748
- fix(web): event form date picker keys and Mod+Enter-only save by @tyler-dane in #4749
- fix(web): read PostHog client from global in track() by @tyler-dane in #4750
- fix(booking): capture /meet funnel events from entry bundle by @tyler-dane in #4751
- fix(booking): keep PostHog ingestion token on public /meet captures by @tyler-dane in #4752
- feat(macos): add one-time life view introduction by @tyler-dane in #4709
- fix(web): remove stray day column header right border by @tyler-dane in #4756
- feat(web): explore calendar before trial checkout by @tyler-dane in #4684
- fix(web): restore local timezone when UTC pin is accidental by @tyler-dane in #4760
- refactor: collapse leftover date-field, trial-lock, and oauth helpers by @cursor[bot] in #4762
- fix(macos): align modal backdrops and stabilize parity captures by @tyler-dane in #4757
- fix(macos): match life intro theme colors to web by @tyler-dane in #4765
- fix(web): calendar zone consistency when browser reports UTC by @tyler-dane in #4763
- fix(web): redirect stale OAuth callbacks after browser back/forward by @tyler-dane in #4769
- feat(web): timezone mismatch banner H and P shortcuts with macOS parity by @tyler-dane in #4768
- refactor: collapse duplicate html escapers and dead timezone branch by @tyler-dane in #4770
- ci: give e2e/timed its own shard so shard 3 fits the step cap by @tyler-dane in #4771
- fix(web): defer awaiting_checkout trial gate to event save by @tyler-dane in #4772
- fix(sync): refresh stale connection state for accurate health snapshots by @tyler-dane in #4773
- feat(analytics): add journey events for logout, billing, and macOS auth by @tyler-dane in #4774
- feat(ci): add nightly staging full-journey Playwright cron by @tyler-dane in #4776
- fix(ci): fail live provider smoke when credentials are missing by @tyler-dane in #4775
- feat(journey): synthetic account tagging and prod journey scaffold by @tyler-dane in #4778
- fix(sync): retire calendars after persistent Google events notFound 404 by @tyler-dane in #4779
- feat(booking): host alert emails on guest book, cancel, and reschedule by @tyler-dane in #4780
- fix(macos): align welcome modal backdrop with web by @tyler-dane in #4767
- fix(web): reduce friction on booking setup address step by @tyler-dane in #4781
- fix(sync): retry Graph and Google 429s and quiet transient job errors by @tyler-dane in #4785
- fix(booking-web): meet landing SEO replaces generic shell tags by @tyler-dane in #4786
- test(e2e): scope staging trial capture duplicate-button check by @tyler-dane in #4734
- fix(macos): restore event form keyboard actions and undo by @tyler-dane in #4784
- fix(email): re-check unsubscribe and queued status before send by @tyler-dane in #4788
- chore(deps): batch minor-and-patch dependency updates by @tyler-dane in #4789
- fix(booking): exhausted failed ops no longer block overlapping bookings by @tyler-dane in #4787
- feat(web): unify trial start ask before Stripe checkout by @tyler-dane in #4791
- feat(web,macos): sidebar hint first-use celebration and remove Hide tips link by @tyler-dane in #4777
- fix(web): close awaiting-checkout gaps in trial gate and billing lock by @tyler-dane in #4790
- fix(web,macos): remove Hide tips from event form footer tips by @tyler-dane in #4792
- fix(web,macos): polish Settings billing trial-not-started UI by @tyler-dane in #4793
- fix(sync): map Microsoft Graph time zones for recurring events by @tyler-dane in #4794
- refactor: collapse leftover trial, timezone, and booking helpers by @cursor[bot] in #4795
- fix(sync): Microsoft Unwind recurrence timezone and weekly BYDAY by @tyler-dane in #4797
- fix(web): full-width week cards after duplicate and move by @tyler-dane in #4798
- fix(macos): keep event form footer instructions readable by @tyler-dane in #4799
- fix(ci): restore expected-provider skips and resolve smoke calendar for contract by @tyler-dane in #4803
- refactor: collapse billing intent gate and microsoft recurrence helpers by @tyler-dane in #4804
- chore(ci): bump actions/download-artifact from 7 to 8 by @dependabot[bot] in #4703
- simplify: dedupe timed draft overlay checks in GridLayoutSnapshotBuilder by @tyler-dane in #4806
- fix(sync): map Microsoft cancelledOccurrences and fetch recurring exceptions by @tyler-dane in #4805
- chore(backend): upgrade stripe-node to 23.0.1 by @tyler-dane in #4807
- simplify: drop redundant timed grid draft overlay merge at render by @tyler-dane in #4810
- simplify: characterization tests for event form and local mutations stack by @tyler-dane in #4808
- simplify: inline timezone trust checks and dedupe browser zone sync by @tyler-dane in #4809
- fix(ci): avoid pipefail SIGPIPE flakes in GitHub script tests by @tyler-dane in #4811
- simplify: share truncateSeriesRulesBefore for local recurring splits by @tyler-dane in #4813
- simplify(web): drop unused hint celebration pulse counter by @tyler-dane in #4814
- simplify: extract EventForm field control ids and focus order util by @tyler-dane in #4815
- simplify: extract event mutation optimistic merge helpers by @tyler-dane in #4816
- refactor(sync): dedupe live provider smoke setup-and-create block by @tyler-dane in #4817
- chore: remove unused TypeScript exports and dead types (knip W4) by @tyler-dane in #4818
- test(core,web,macos): share go-to-date parse vectors (W9) by @tyler-dane in #4819
- test(core,sync,macos): centralize rrule vector inputs (W9) by @tyler-dane in #4820
- test(e2e): W2 reliability (week grid, oauth, waits, flaky summary) by @tyler-dane in #4821
- test(core,web): share US DST civil-day vector data (W9) by @tyler-dane in #4822
- fix(web): show empty-grid pointer hint on every click by @tyler-dane in #4825
- fix(backend): return 500 when Stripe webhook processing fails by @tyler-dane in #4826
- fix(sync): use recurrence-zone wall clock for Microsoft EXDATE by @tyler-dane in #4824
- refactor: dedupe microsoft zone resolution and the email dispatch send tail by @tyler-dane in #4827
- fix(web): stabilize parity captures and checkout keyboard focus by @tyler-dane in #4829
- fix(web): wrap welcome guide footer links instead of scrolling sideways by @tyler-dane in #4832
- fix(web): exclude hidden partners from week draft deck layout by @tyler-dane in #4833
- fix(macos): match header icons and isolate strict verification by @tyler-dane in #4831
- refactor: share hidden-draft strip, pointer gates, and outlook prefer headers by @cursor[bot] in #4835
- fix(macos): polish native chrome and keyboard behavior by @tyler-dane in #4802
- simplify(macos): move NativeCalendarRootModel keyboard focus into extension by @tyler-dane in #4836
- fix(macos): preserve pinned parity capture hints by @tyler-dane in #4839
- fix(macos): restore desktop parity capture for mod-hold and meeting link by @tyler-dane in #4837
- fix(macos): keep event labels inside visible cards by @tyler-dane in #4841
- refactor(sync): retire dead graph zone option and dedupe microsoft recurrence mapping by @tyler-dane in #4844
- fix(macos): separate overlapping event deck edges by @tyler-dane in #4843
- fix(macos): retain composited parity window references by @tyler-dane in #4846
- feat(ci): wire synthetic journey emails on staging deploy by @tyler-dane in #4849
- Weekly security audit 2026-10-26 by @tyler-dane in #4851
- refactor(backend): weekly simplicity audit (booking-host email dispatch) by @tyler-dane in #4850
- fix(macos): anchor palette to viewport top inset by @tyler-dane in #4848
- fix(web): abort hung user metadata fetch so SSE/poll refresh can recover by @tyler-dane in #4853
- fix(journey): unblock staging signup event create and save by @tyler-dane in #4854
- feat(web): recover Google signup when calendar scopes are declined by @tyler-dane in #4852
- fix(journey): wait for connect dismiss and fix artifact path by @tyler-dane in #4855
- fix(journey): snooze connect prompt and disambiguate grid events by @tyler-dane in #4856
- fix(journey): open settings via sidebar control name by @tyler-dane in #4857
- fix(journey): wait for calendars after re-login by @tyler-dane in #4858
- fix(web): flush pending event writes before logout by @tyler-dane in #4859
- fix(journey): target delete-account dialog and confirmation phrase by @tyler-dane in #4860
- fix(macos): match measured palette typography by @tyler-dane in #4862
- refactor: share session flags, synthetic account check, and logout write timeout by @cursor[bot] in #4866
- fix(macos): show settings navigation keyboard focus by @tyler-dane in #4864
- fix(macos): align settings field line boxes with web by @tyler-dane in #4868
- refactor: dedupe provider zone fallback, journey leg steps, and logout write wait by @tyler-dane in #4871
- fix(macos): focus recurrence control from form shortcuts by @tyler-dane in #4870
- fix(sync): dedupe exhausted self-heal error logs by @tyler-dane in #4874
- fix(web): stabilize description list toggle on partial selections by @tyler-dane in #4875
- fix(web): reload once on stray missing-chunk rejections by @tyler-dane in #4876
- fix(billing): keep compasscaltest.invalid on the real trial path by @tyler-dane in #4879
- fix(macos): preserve duration when event times invert by @tyler-dane in #4877
- test(e2e): align staging trial capture with explore-first flow by @tyler-dane in #4882
- test(web): regress overlap deck width after delete and hide by @tyler-dane in #4880
- fix(web): wait for SuperTokens session after sign-up by @tyler-dane in #4881
- test(e2e): staging signup trial capture billing address on submit by @tyler-dane in #4883
- fix(web): show Stripe catalog price on trial ask by @tyler-dane in #4884
- fix(macos): focus event calendar menu from shortcut by @tyler-dane in #4873
- fix(web): keep plain Enter from starting trial by @tyler-dane in #4886
- feat(web): optional subscription cancel reason by @tyler-dane in #4878
- fix(web): Esc back from embedded trial checkout by @tyler-dane in #4887
- fix(web): hide legal footer on signup trial step by @tyler-dane in #4888
- fix(web): tighten trial modal layout on narrow viewports by @tyler-dane in #4889
- fix(web): show trial charge date on ask screen by @tyler-dane in #4893
- simplify(web): trial copy from trialLengthDays and billing util move by @tyler-dane in #4891
- feat(web): track checkout_opened and checkout_back by @tyler-dane in #4890
- fix(macos): focus and operate rsvp responses from keyboard by @tyler-dane in #4895
- fix(backend): monthly staging preview loop and generation dedupe by @tyler-dane in #4900
- fix(web): show trial price on the trial ask screen by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4903
- fix(web): date input and month picker keyboard focus by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4906
- fix(web): fit date picker keycap hint by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4907
- refactor: share preview-loop skip and drop unused trial ask prop by @cursor[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4904
- fix(macos): restore calendar and rsvp tab traversal by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4897
- fix(web): deck timed overlaps across mixed instant encodings by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4905
- test(web): Tyler overlap deck evidence v2 and fall-back week MDT label by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4908
- refactor(web): retire overlap screenshot harness and orphaned trial charge line by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4909
- fix(e2e): stabilize explore-before-trial draft create shortcut by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4910
- fix(macos): match web navigation glyphs and header spacing by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4902
- fix(web): require step on signup_step_viewed analytics by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4911
- docs(macos): reconcile verified parity acceptance evidence by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4914
- fix(macos): stabilize PostHog distinct id and session tracking by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4912
- fix(macos): restore location focus on repeated shortcut by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4916
- fix(macos): restore guests focus on repeated shortcut by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4918
- refactor: share event form focus pulse and drop unused date state by @cursor[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4927
- fix(macos): focus meeting link on shortcut requests by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4926
- refactor: dedupe repeated provider schedule parsing, calendar retirement, and e2e local seeding by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4930
- fix(macos): restore title focus on repeated shortcut by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4929
- fix(web): event form freezes on descriptions with multiple links (booking events) by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4931
- feat(booking): signed-in meet page owner inbox (staging only) by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4933
- fix(web): retry event saves through a backend restart and stop blaming the connection by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4934
- fix(core): keep the dst-week hour gutter aligned in every browser time zone by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4935
- fix(web): split week grid overlaps into side-by-side columns by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4932
- feat(booking): enable meet owner inbox in prod and tighten rows by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4936
- fix(sync): keep zero-length Google all-day events instead of skipping them by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4937
- fix(macos): leave plain description paragraphs on tab by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4939
- fix(web): match shortcut level badge to footer icon style by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4943
- fix(web): group grid overlaps when parsed end is before start by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4940
- fix(macos): include owned popovers in window references by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4942
- fix(web): keep today visible in partial week grid windows by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4946
- refactor: fold four duplicated predicates out of last week's merges by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4947
- feat(deploy): zero-downtime backend cutover on staging by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4948
- chore(ci): read-only prod overlap export workflow by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4949
- feat(ci): wire prod synthetic journey emails and Stripe discount by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4950
- feat(macos): track autonomous parity acceptance by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4952
- fix(ci): repair prod overlap export mongosh invocation by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4953
- fix(deploy): migrate legacy backend before api-proxy bind by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4954
- feat(web): one-click first event prompt with Mod+Enter hint by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4955
- fix(deploy): complete legacy-to-proxy cutover with docker stop and bind retry by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4956
- fix(ci): resolve Tyler principal via booking slug fallbacks by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4958
- feat(analytics): signup_completed after session ready and synthetic PostHog flags by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4962
- fix(web): prod overlap export lookup and export-to-grid regression by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4961
- fix(deploy): cap compose wait and staging deploy job runtime by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4965
- feat(macos): switch app icon with selected theme by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4945
- fix(ci): wire SSH vars in staging cutover proof workflow by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4963
- fix(deploy): enforce public and loopback version.json in deploy health check by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4969
- fix(self-host): run compose wait under timeout via script re-exec by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4970
- test(macos): verify meeting copy link semantics by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4959
- fix(deploy): nginx DNS re-resolve and staging save-loop proof wiring by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4971
- fix(web): show grid card times in pinned calendar zone by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4972
- feat(web): icon-only reload and update-available toast by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4974
- fix(web): unify description link keyboard hints by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4960
- fix(analytics): signup_completed identify race and disable Mac CI PostHog by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4967
- fix(deploy): recreate api-proxy after nginx config directory sync by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4976
- fix(web): align context menu row focus with menu chrome by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4978
- fix(deploy): drain nginx workers before stopping old backend slot by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4979
- fix(web): stack update toast above first-event card and clear sidebar footer by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4977
- fix(web): keep description link hint chrome in panel bounds by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4980
- fix(web): fit app-update toast chrome to content at wide widths by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4981
- fix(macos): prioritize resolved edit sequence fields by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4975
- fix(ci): parameterize staging save-loop proof for selfhosted target by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4985
- fix(web): place description link hint below text, one bar by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4982
- fix(self-host): align SuperTokens core image with supertokens-node 24 by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4986
- fix(self-host): pin SuperTokens core to 11.4.8 on selfhosted staging by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4988
- fix(self-host): cutover proxy drain and upstream retries for save-loop proof by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4989
- fix(self-host): avoid redundant api-proxy recreate on selfhosted deploy by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4991
- refactor: drop leftover duplication from this week's merges by @cursor[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4990
- feat(web): unify bottom-left notice stack with primary CTAs by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4987
- fix(self-host): remove post-sync proxy stable gate that blocked staging deploy by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4992
- fix(self-host): revert staging deploy scripts to v1.3.470 baseline by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4994
- fix(self-host): in-place api-proxy sync to eliminate cutover 502 window by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4996
- fix(billing): keep prod journey signups on awaiting_checkout trial path by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4997
- fix(web): u/i keyboard focus moves between grid and sidebar by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4998
- feat(onboarding): shortcuts step, first-event C keycap, signup layout by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4999
- fix(web): stop i from inserting into life birth date on focus move by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5000
- fix(web): hide bottom notices on mobile gate so game tray receives touches by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5004
- fix(web): signup providers at 360px, opaque first-event card by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5001
- fix(web): narrow sidebar layout, focus rings, and 360 overflow guard by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5005
- fix(web): keep sidebar footer icons in one contiguous group by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5006
- test(macos): cover ordered description list persistence by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4984
- fix(web): remap event menu and meeting nudge off M by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5007
- fix(web): lift bottom notices above sidebar footer at 360px by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5010
- fix(web): show week picker and grid focus rings after i/u by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5016
- test(macos): verify partial bullet selection persistence by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5015
- fix(web): hide bottom notices during auth and onboarding by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5018
- fix(billing): complete synthetic prod journey checkout without tax by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5021
- chore(macos): map reviewed onboarding and description behaviors by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5020
- fix(web, macos): restore centered up-next nudge outside notice stack by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5022
- fix(web): show trial ask after first event save (explore-first) by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5024
- fix(e2e): reapply journey hardening and manual synthetic cleanup by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5025
- fix(ci): journey cleanup email gate and staging bootstrap by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5028
- fix(web): pin event card timezone regression clock by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5032
- fix(macos): retain destination help on named description links by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5027
- fix(web): keep event form title responsive under fast typing by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5035
- fix(web): keep event title uncontrolled during fast typing by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5038
- fix(ci): pass resolved email to journey stripe cleanup by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5030
- fix(e2e): unblock prod journey after ConnectCalendarPrompt deferral by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5034
- fix(web): keep wall-clock times correct on dst change days by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5040
- refactor: fold leftover copies from yesterday's notice, focus, and journey merges by @cursor[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5041
- fix(core,web): repair the 2026-11-01 DST fall-back breakage on main by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5043
- refactor(self-host): drop dead proxy helpers and share cutover diagnostics by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5042
- fix(backend): pass stripe customer delete options in the options slot by @claude[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5045
- fix(e2e): stabilize staging ui-focus capture and strengthen grid ring by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5017
- chore(ci): bump actions/upload-artifact from 4 to 7 by @dependabot[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4919
- fix(sync): log schedule shape on google write 400s by @PostHog[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4899
- fix(backend): rate-limit account deletion per user, not per IP by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5047
- chore(deps): bump @stripe/stripe-js from 9.17.0 to 10.1.0 by @dependabot[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4922
- fix(core): log transient mongo connect and monitor timeouts at warn by @PostHog[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/4892
- fix(sync): shorten Outlook subcalendar discovery latency by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5011
- fix(sync): color-only edits omit schedule on provider patch by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5012
- fix(web): hide focused events with x consistently by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5013
- fix(e2e): open Billing before cancel in journey specs by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5048
- fix(web): align event form times with grid and overlap deck z-index by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5009
- fix(e2e): assert scheduled cancel via Resume subscription in journeys by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5049
- test(macos): cover welcome heading click then return by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5050
- fix(e2e): wait for logout before prod journey re-login; keep artifacts through fallback by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5051
- fix(ci): exclude journey pending account from prod journey artifacts by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5052
- fix(web): keep bottom notice gap equal to left gap when right sidebar is open by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5055
- chore(macos): record reviewed navigation and layout gaps by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5054
- fix(web): settle stale sessions into one sign-in prompt by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5056
- fix(backend): pin the booking test monday inside the frozen clock horizon by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5062
- chore(agents): ship with gh pr merge --auto, no agent-automerge label by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5061
- fix(web): lay out overlapping timed events as a google-style cascade by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5058
- fix(sync): keep an edit-all that moves a series when google rejects the old override by @PostHog[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5060
- refactor: fold leftover copies from recent notice, form, and sync merges by @cursor[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5064
- refactor: fold duplicate remote playwright configs and a stale form flushSync by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5065
- fix(e2e): pin a sample-event-free clock for the bottom notice stack spec by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5066
- fix(web): one-click calendar access retry for every short Google sign-in by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5067
- fix(analytics): tag checkout_expired as synthetic and keep journey browser events by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5068
- fix(web): keep settings, palette, and picker layouts stable while loading by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5070
- fix(web): keep palette recent row while meeting command loads by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5072
- feat(attendees): suggest past guests and ask for contacts per account by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5071
- fix(web): hold layout while sidebar, palette and meeting tab load by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5073
- feat(booking): add meeting types contract and backend by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5074
- feat(web): add meeting types editor to Settings > Meeting by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5075
- feat(booking-web): let guests pick a meeting type by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5076
- refactor: share meeting-type duration labels and billing access gate by @cursor[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5078
- refactor: drop a provider branch, a positional-hole constructor, and three copies from this week's merges by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5079
- feat(macos): meeting types parity, plus layout-stability and staging journey e2e by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5077
- feat(web): compact, collapsible all-day row with Shift+A and keyboard-first hint by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5080
- fix(sync): skip held-off calendars and recently refused calendar lists in sweeps by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5084
- fix(web): real 404s, app landmarks, canonicals and keyboard-first copy by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5085
- fix(web): self-referencing canonical for /life and /shortcuts in server HTML by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5086
- refactor: share type-#1 omit, spa route constants, and discovery backoff by @cursor[bot] in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5087
- fix(self-host): copy routes.ts into web runtime images by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5088
- test(macos): cover go-to-date keyboard navigation by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5091
- Weekly security audit 2026-11-02 by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5069
- refactor: drop the dead slot-engine reservation input and share the grid day columns by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5089
- feat: add opt-in calendar reflection emails by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5083
- fix(web): improve Life view birth date picker keyboard UX by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5093
- feat(web): replace loading ring with pixel compass by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5096
- fix(web): gate local calendar trial popover on auth and billing by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5097
- feat(web): Places location autocomplete loading and attribution by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5099
- fix(scripts): stop stale worktree claims from exhausting dev ports by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5100
- feat(web): show last updated date on shortcuts catalog by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5101
- feat(web): show current time on the now-line in day and week grids by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5095
- fix(web): fuzzy command palette event search and loading spinner by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5104
- fix(web): keep grid event focus rings fully visible by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5105
- feat(scripts): classify verify test failures against origin/main by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5102
- feat(web): keyboard-first About Compass dialog by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5106
- fix(sync): dedupe connection invalidations on concurrent state refresh by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5107
- fix(web): keep node:crypto off shortcuts catalog boot path by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5110
- feat(booking-web): meet page owner edit and empty availability UX by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5112
- feat(scripts): scoped macOS parity maintenance loop by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5113
- fix(sync): treat empty providerVersion as absent at persistence by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5121
- fix(sync): tolerate empty providerVersion from provider cancellation reads by @tyler-dane in https://github.com/KeepSoftwareSimple/compass-calendar/pull/5128
Full Changelog: v1.3.0...v1.4.0