Skip to content

v1.2.0

Choose a tag to compare

@tyler-dane tyler-dane released this 01 Sep 21:19
· 1189 commits to main since this release
f349c9e

What's Changed

  • fix(web): stabilize up next card by @tyler-dane in #2547
  • fix(web): stop throwing when right-clicking an uncached event by @PostHog[bot] in #2549
  • fix(web): keep event's own date selectable in recurrence "Ends on" picker by @PostHog[bot] in #2550
  • fix(web): patch tanstack router redirect race throwing undefined by @cursor[bot] in #2553
  • docs: align google sync focus refresh and sse contracts by @cursor[bot] in #2554
  • fix(web): drop opaque script error exceptions in posthog by @cursor[bot] in #2551
  • feat(core,sync,backend,web): surface meeting links, location, attendees, and rich-text descriptions by @tyler-dane in #2555
  • fix(web): harden description link paste, attendee a11y, richer demo data by @tyler-dane in #2556
  • feat(core,sync,backend,web): make event location editable by @tyler-dane in #2557
  • feat(web): show a Join link on the Up Next card by @tyler-dane in #2558
  • fix(web): allow 15-min draft drag without flip by @tyler-dane in #2559
  • feat: Up Next banner with Open/Join and meeting links by @tyler-dane in #2561
  • fix(web): keep Enter as newline in description editor by @tyler-dane in #2560
  • fix(web): Up Next banner contrast and dismiss/entrance polish by @tyler-dane in #2562
  • fix(web): submit event form with Mod+Enter from color swatch by @tyler-dane in #2563
  • feat(core,backend,sync): carry calendar account email and event iCalUID on the wire by @tyler-dane in #2564
  • feat(core,backend,web): show connected Google accounts as separate calendar sections by @tyler-dane in #2565
  • feat(web): let the user choose which calendar new events go to by @tyler-dane in #2566
  • feat(sync,web): let a connected user add another Google account by @tyler-dane in #2567
  • feat(backend,web): let a user disconnect one Google account by @tyler-dane in #2568
  • feat(core,sync,backend): carry each event's cross-copy key to the browser by @tyler-dane in #2569
  • feat(web): show a meeting connected on two accounts as one event by @tyler-dane in #2570
  • feat(scripts): add backfill-icaluid CLI to correlate pre-MA1 events by @tyler-dane in #2571
  • feat(scripts): add audit-connection-identity to report A2 collisions by @tyler-dane in #2572
  • feat(web): paint a two-color gradient accent on merged cross-account cards by @tyler-dane in #2573
  • fix(web): eliminate the flaky keyboard-selection e2e failure by @tyler-dane in #2574
  • refactor: simplify multi-account cross-account-merge plumbing by @tyler-dane in #2575
  • fix(web): stop showing a redundant top-level header once account sections take over by @tyler-dane in #2576
  • fix(sync): break the unwatchable-calendar bootstrap loop by @tyler-dane in #2577
  • fix(web): scope single-account sidebar header to the signed-in user's own connection by @tyler-dane in #2578
  • feat(web): move add/disconnect account behind palette + hover, add per-account collapse by @tyler-dane in #2579
  • refactor(web): dedupe sidebar account-heading UI and memoize calendar grouping by @tyler-dane in #2580
  • feat(web): Settings menu (Mod+,) with Accounts section, remove default-calendar star by @tyler-dane in #2581
  • fix(web): quiet the sidebar - hide healthy status, no loading shift, muted rows by @tyler-dane in #2583
  • refactor(web): move Add account from sidebar hover icon to command palette by @tyler-dane in #2584
  • refactor(web): render one account header for every account by @tyler-dane in #2585
  • refactor(web): memoize the event pipeline once, in its only consumer by @tyler-dane in #2586
  • refactor(web): one calendar ordering shared by sidebar, Settings and the event form by @tyler-dane in #2587
  • refactor(sync): delete the three sweep wrapper services by @tyler-dane in #2588
  • refactor(web): unify the add-account gate between the palette and Settings by @tyler-dane in #2589
  • refactor(sync): one signal for a stalled bootstrap by @tyler-dane in #2590
  • refactor(backend,web): dedupe google.connection wire field and sync-client error wrapping by @tyler-dane in #2591
  • feat(scripts): add backfill-bootstrap-state CLI for the OPS-1 migration by @tyler-dane in #2592
  • feat(logging): ship backend + sync logs to PostHog by @tyler-dane in #2594
  • fix(sync): preserve iCalUID across sparse provider upserts by @tyler-dane in #2596
  • refactor(sidebar): move "Saving changes…" to reserved footer strip by @tyler-dane in #2598
  • Allow arbitrary minute times in event form time picker by @tyler-dane in #2597
  • fix(web): give LifeView tests a query client provider by @tyler-dane in #2600
  • chore(scripts): retire backfill-icaluid command by @tyler-dane in #2599
  • refactor(sync): retire the bootstrapState schema default by @tyler-dane in #2593
  • Command palette: fuzzy search, About action, fix Settings shortcut by @tyler-dane in #2601
  • Command palette: interaction quality and polish pass by @tyler-dane in #2602
  • fix: manual google disconnect shows success, not alarm by @tyler-dane in #2595
  • Fix disconnected account lingering in UI, consolidate palette account items by @tyler-dane in #2603
  • fix(web): pin google sync status to sidebar bottom bar, add Settings log out by @tyler-dane in #2604
  • fix(web): flush local events onto Google, not the local calendar, at connect time by @tyler-dane in #2605
  • fix(web): exclude local calendar from writable set once an account is connected by @tyler-dane in #2609
  • fix(web): hide the local calendar sidebar row once an account is connected by @tyler-dane in #2610
  • fix(web): relabel the local calendar row via its existing account heading by @tyler-dane in #2611
  • test(web): verify disconnect restores the local calendar as a target and row by @tyler-dane in #2612
  • Add "Now" state to Up Next event component for late arrivals by @tyler-dane in #2608
  • fix(web): read the real end time for midnight-spanning Up Next events by @tyler-dane in #2613
  • Stop re-asking "Apply to series?" after user treats instance as one-off by @tyler-dane in #2607
  • fix(web): stop day-view all-day events rendering as slivers by @tyler-dane in #2614
  • fix(sync): stop a deleted-then-recreated event from becoming undeletable by @tyler-dane in #2615
  • fix(events): stop delete-undo from failing and lying about it by @tyler-dane in #2616
  • refactor: ui declutter slice 1 (dead code, css, palette cleanup) by @tyler-dane in #2617
  • feat(shortcuts): add registry and searchable legend overlay by @tyler-dane in #2618
  • fix(web): remove border from UpNextCard to reduce visual clutter by @tyler-dane in #2620
  • Remove donation language from welcome dialog and README by @tyler-dane in #2623
  • fix(lockfile): regenerate after removing unused dependencies by @tyler-dane in #2621
  • feat(shortcuts): wire up state-aware context to legend overlay by @tyler-dane in #2624
  • fix(web): eliminate flash when creating and saving a new event by @tyler-dane in #2626
  • fix(web): smooth logout UX with pending state, no flash, confirmation toast by @tyler-dane in #2627
  • refactor(web): collapse anonymous sidebar to single 'This browser' row by @tyler-dane in #2628
  • fix(lockfile): drop stale packages/web deps from workspace block by @tyler-dane in #2629
  • fix(web): 'Ends on' date now inclusive in recurring events by @tyler-dane in #2630
  • fix: restore green CI on main (web mock pollution, undo callbacks, tailwindcss, backend metadata mock, lint) by @tyler-dane in #2633
  • fix(sync): surface the cause of sync job failures, stop retrying unwatchable calendars by @tyler-dane in #2634
  • fix(sync): settle durable google watch failures instead of retrying by @cursor[bot] in #2635
  • fix(web): remove duplicate border above sidebar status bar by @tyler-dane in #2638
  • feat(web): dismiss the visible toast on Escape by @tyler-dane in #2639
  • fix(sync): retire calendars the provider no longer lists by @tyler-dane in #2640
  • fix(web): make event-form-open state and sidebar persistence single-sourced by @tyler-dane in #2641
  • refactor(web): remove sidebar prop-drilling and the createSidebar DI factory by @tyler-dane in #2642
  • refactor(backend): delete the dead pre-sync Google surface by @tyler-dane in #2643
  • refactor(sync): delete dead job kinds, failure classes, and repository surface by @tyler-dane in #2644
  • fix(ci): regenerate bun.lock after backend dependency removals by @tyler-dane in #2646
  • refactor(web): unify the Day/Week interaction registries by @tyler-dane in #2648
  • chore(scripts): retire four completed one-off CLI commands by @tyler-dane in #2645
  • refactor(sync): collapse the copy-pasted sweep wiring and repository filters by @tyler-dane in #2647
  • refactor(backend,core): collapse sync-client seams and duplicate contract names by @tyler-dane in #2649
  • test(sync,backend): add shared fixture builders for calendars, resources, and connections by @tyler-dane in #2650
  • feat(backend): report notFound and conflict kinds from the sync client by @tyler-dane in #2651
  • feat(sync): persist the unwatchable-calendar verdict instead of retrying every pull by @tyler-dane in #2652
  • fix(backend,core): retire the legacy user.google credential slot by @tyler-dane in #2653
  • fix(sync): require endAt on event occurrences by @tyler-dane in #2654
  • refactor(web): converge Day/Week "i"/"t" shortcuts, relocate useGlobalShortcuts by @tyler-dane in #2655
  • fix(sync): resolve all-day recurring instances by date, not datetime by @tyler-dane in #2656
  • chore(claude): guard against committing to a stale/reused main worktree by @tyler-dane in #2657
  • refactor(web): converge Week create-shortcuts on the view command bus, dedupe minute tickers by @tyler-dane in #2658
  • feat(web): instrument activation funnel and fix PostHog identity/environment gaps by @tyler-dane in #2659
  • refactor(web): use stable markers for sidebar toggle focus hand-off by @tyler-dane in #2662
  • feat(web): explain export JSON contents for data-governance users by @tyler-dane in #2663
  • fix(sync): prioritize user refresh over restart backlog by @tyler-dane in #2660
  • fix(web): make sync status honest and refresh wait for real work by @tyler-dane in #2664
  • refactor(web): consolidate interaction gesture constants and z-index escapes by @tyler-dane in #2665
  • fix(web): place all-day events on the correct day in Day View by @tyler-dane in #2666
  • fix(web): lock app shortcuts while OverlayPanel is open by @tyler-dane in #2667
  • fix(web): dismiss shortcuts overlay through app shortcuts by @tyler-dane in #2668
  • fix(backend): return 410 for GOOGLE_REVOKED instead of 401 by @tyler-dane in #2669
  • refactor(web): share dismiss transitions and reduced-motion checks by @tyler-dane in #2670
  • fix(sync): show Google all-day events west of UTC by @tyler-dane in #2671
  • fix(web): humanize google sync status copy by @tyler-dane in #2672
  • fix(web): trap focus in welcome and release-notes dialogs by @tyler-dane in #2673
  • fix(web): restore sidebar form contrast for muted text and timepickers by @tyler-dane in #2675
  • refactor(web): starting-style palette reveal and shared edge threshold by @tyler-dane in #2676
  • feat(web): confirm before discarding dirty event edits on escape by @tyler-dane in #2674
  • refactor(web): replace Escape DOM probe with floating-layer registry by @tyler-dane in #2677
  • fix(web): clean up grid mouse-down listeners on unmount by @tyler-dane in #2679
  • fix(sync): keep google instances when apply-all discards overrides by @tyler-dane in #2678
  • refactor(web): restore OverlayPanel focus without setTimeout by @tyler-dane in #2680
  • refactor(web): fold clsx into classnames by @tyler-dane in #2681
  • refactor(web): show db-init toast after paint by @tyler-dane in #2682
  • refactor(web): scroll TimePicker selection after paint by @tyler-dane in #2683
  • refactor(web): extract ScrollableRegion for grid scroll a11y by @tyler-dane in #2684
  • refactor(web): finish zod v4 imports for leftover modules by @tyler-dane in #2685
  • refactor(web): close EventForm via queueMicrotask by @tyler-dane in #2686
  • refactor(web): split Week shortcuts into owner and registration by @tyler-dane in #2687
  • refactor(web): stamp registry ids on read-only event cards by @tyler-dane in #2688
  • feat(web): show live day and up-next context in the tab title by @tyler-dane in #2690
  • fix(web): seed day events from overlapping week cache by @tyler-dane in #2692
  • fix(web): keep calendar chrome visible during event load by @tyler-dane in #2693
  • fix(web): give slow drag commits more time before clone teardown by @tyler-dane in #2694
  • fix(web): keep google reconnect status congruent by @tyler-dane in #2691
  • feat(web): add e-prefix sequences to focus event form fields by @tyler-dane in #2695
  • feat(web): make event focus arrows spatial in week and day by @tyler-dane in #2697
  • feat(web): focus weekday columns with digit keys 1-7 by @tyler-dane in #2698
  • fix(web): refresh shortcut legend when a grid event is focused by @tyler-dane in #2699
  • fix(sync): drop durable calendarList discovery failures by @tyler-dane in #2696
  • feat(web): flash event jump keys while holding shift by @tyler-dane in #2700
  • feat(web): document hold-shift event jump keys by @tyler-dane in #2701
  • feat(web): add shift-shift keyboard-only mode by @tyler-dane in #2702
  • feat(web): add interactive onboarding tour after Start Now by @tyler-dane in #2703
  • feat(web): add redo last change to the command palette by @tyler-dane in #2704
  • fix(web): keep drag placeholder dim across week navigation by @tyler-dane in #2705
  • refactor(web): share escape ownership and shift-key helpers by @tyler-dane in #2706
  • fix(web): sequence onboarding palette before shortcuts tip by @tyler-dane in #2707
  • feat(web): polish keyboard-only discovery and palette enter by @tyler-dane in #2709
  • fix(web): thicken onboarding tour liquid glass contrast by @tyler-dane in #2708
  • fix(web): restore grid focus after event form closes by @tyler-dane in #2710
  • fix(sync): clear exhausted jobs blocked by durable read failures by @cursor[bot] in #2712
  • feat(web): toggle day-prefix event jump with Shift by @tyler-dane in #2711
  • fix(web): hide Compass day column when Google is connected by @tyler-dane in #2713
  • feat(web): tint day columns from all-day event color by @tyler-dane in #2714
  • refactor(web): delete dead code left by the past week's rapid iteration by @tyler-dane in #2715
  • refactor(web): remove Week's create-draft emit-then-subscribe round-trip by @tyler-dane in #2721
  • refactor(web): dedupe app-lock checks, escape check, and event-target lookup by @tyler-dane in #2717
  • refactor(web): make onboarding tour step order a single source of truth by @tyler-dane in #2718
  • refactor(web): share account sync-status derivation between sidebar headers by @tyler-dane in #2719
  • test(web): guard Settings' live reconnect-required rendering by @tyler-dane in #2720
  • refactor(web): unify the shift-hint and keyboard-only tap detectors by @tyler-dane in #2722
  • fix(web): show event jump labels on Shift press by @tyler-dane in #2723
  • fix(web): focus Cancel and add Shift+Esc discard by @tyler-dane in #2725
  • fix(sync): stop stale-command sweep from freezing fleet-wide on one bad row by @tyler-dane in #2728
  • fix(web): keep day arrow keys on event focus by @tyler-dane in #2726
  • feat(web): shift only the start or end of a focused event via keyboard by @tyler-dane in #2727
  • fix(sync): stop misclassifying transient Google read errors as durable by @tyler-dane in #2729
  • fix(web,sync): close the silent dead ends in the Google connect flow by @tyler-dane in #2731
  • fix(web): stop the UI from claiming stale sync state is current by @tyler-dane in #2732
  • fix(web): stop the import overlay lying to established users, name the account by @tyler-dane in #2733
  • feat(web): jump event form focus with a Mod+E field-jump sequence by @tyler-dane in #2734
  • feat(web): replace google import overlay with pirate scouting loader by @tyler-dane in #2737
  • feat(web): place timed drafts with shift+arrow by @tyler-dane in #2735
  • fix(web): suppress load-error UI during session expiry by @tyler-dane in #2738
  • fix(web): keep earlier recurrence instances when opening an occurrence by @tyler-dane in #2739
  • feat(web): keyboard-education — onboarding, connect/trial CTAs, shortcut tips by @tyler-dane in #2736
  • feat(backend,web): record trial state server-side; wire trial CTA by @tyler-dane in #2740
  • fix(web): close ends-on datepicker on outside click by @tyler-dane in #2741
  • refactor(web): use semantic recurrence equality on open by @tyler-dane in #2742
  • Sandbox mode: keyboard-only entry + synthetic practice events for onboarding tour by @tyler-dane in #2743
  • Rewrite welcome-modal copy to pitch the keyboard-first identity by @tyler-dane in #2745
  • fix(web): keep event color responsive during optimistic replace by @tyler-dane in #2744
  • fix(web): improve keyboard practice tour affordances by @tyler-dane in #2747
  • fix(sync): stop provider_event_identity collisions on series instance edits by @tyler-dane in #2748
  • fix(sync,web): clear remaining event-color optimistic risks by @tyler-dane in #2749
  • fix(web): shift jump, focus contrast, and recurrence nudge bugs by @tyler-dane in #2750
  • fix(web,core): rebase remote promote-all onto series master delta by @tyler-dane in #2751
  • feat(web): onboarding polish - welcome shortcuts, Hardcore Mode, all-day nudge convert by @tyler-dane in #2752
  • Expand welcome modal copy and FAQ for newcomers by @tyler-dane in #2753
  • Sync reliability hardening before Friday launch by @tyler-dane in #2754
  • fix(web): commit event duplicates immediately instead of opening the form by @tyler-dane in #2755
  • feat(web): mission-based guided tour redesign by @tyler-dane in #2756
  • Remove in-app email opt-in; automate list sync outside the repo by @tyler-dane in #2759
  • refactor(web): remap event jump to s and hardcore to h by @tyler-dane in #2758
  • fix(web): calendar-colored event focus chrome by @tyler-dane in #2760
  • Replace guided tour with Shortcut Showcase onboarding by @tyler-dane in #2761
  • feat(web): make edit-field shortcuts discoverable with a which-key menu by @tyler-dane in #2762
  • fix(backend,sync): launch hardening for durable errors and writes by @tyler-dane in #2763
  • fix(web): close the practice title editor before the next lesson key by @tyler-dane in #2764
  • ci: run e2e on pushes to main by @tyler-dane in #2765
  • fix(backend,sync): ride out transient mongo health blips by @tyler-dane in #2766
  • style(web): keep welcome modal keycap hints always visible by @tyler-dane in #2767
  • feat(web): map e then c to color, e then a to account by @tyler-dane in #2768
  • fix(web): make onboarding shortcuts easier to follow by @tyler-dane in #2770
  • fix(web): share compact CTA hover and inline showcase keycaps by @tyler-dane in #2771
  • fix: multi-account sync disappearing calendar and stuck import by @tyler-dane in #2772
  • feat(backend,web): require card at trial start via stripe checkout by @tyler-dane in #2773
  • fix(billing): inject staging stripe secrets and match $7.99 copy by @tyler-dane in #2774
  • fix(web): hide signed-out toast for first-time visitors by @tyler-dane in #2775
  • fix(scripts,ci): make fresh worktrees self-configuring and CI hangs bounded by @tyler-dane in #2777
  • fix(billing): surface checkout failures and stop silent start-trial 500s by @tyler-dane in #2776
  • fix(sync): remint access token in-process on events.list 401 by @tyler-dane in #2778
  • fix(backend): gate hosted users without a stripe subscription by @tyler-dane in #2780
  • feat(web): fade showcase overlay into the calendar by @tyler-dane in #2779
  • feat(billing): add operator pause switch for trial enforcement by @tyler-dane in #2782
  • feat(web): show Product Hunt badge on welcome by @tyler-dane in #2781
  • fix(web): filter benign ResizeObserver loop warning from PostHog by @tyler-dane in #2783
  • fix(web): remove shuffle icon from life quotes by @tyler-dane in #2784
  • fix(web): skip calendar onboarding overlays on /life by @tyler-dane in #2786
  • fix(sync): confirm Google “delete this occurrence” instead of 502 by @tyler-dane in #2787
  • fix(web): show calendar age on life view before birthday by @tyler-dane in #2788
  • fix(web): commit focused time option on tab by @tyler-dane in #2790
  • fix(sync): import selected hidden calendars and offset-only events by @tyler-dane in #2789
  • fix(sync): close two holes in Google push delivery by @tyler-dane in #2791
  • docs(acceptance): correct Scenario 10 for hidden vs selected calendars by @tyler-dane in #2792
  • feat: automate production error triage via PostHog issue pipeline by @tyler-dane in #2796
  • docs: cover hardcore mode, onboarding, and failed-job self-heal by @cursor[bot] in #2724
  • fix(dev): fill sync.* config placeholders in backend bootstrap by @tyler-dane in #2795
  • fix(web): ignore keyboard events with a missing key by @tyler-dane in #2793
  • fix(web): focus current time for picker arrow keys by @tyler-dane in #2794
  • fix(backend): strip prototype-polluting keys before metadata merge by @tyler-dane in #2797
  • fix(web): drop phantom dead clicks and put signup before the shortcut practice by @tyler-dane in #2798
  • fix(web): keep the day when a time-picker correction crosses midnight by @tyler-dane in #2801
  • fix(web): discard unused keyboard-place drafts on escape by @tyler-dane in #2800
  • feat(web): scroll the timed grid with PageUp and PageDown by @tyler-dane in #2799
  • fix(sync): watch the Google calendar list so subcalendar renames reach Compass by @tyler-dane in #2803
  • fix(web): cycle Tab edge focus on keyboard-place drafts by @tyler-dane in #2804
  • fix(ci): grant id-token permission so the error-autofix agent can authenticate by @tyler-dane in #2806
  • fix(sync): surface an honest error when Google declines an event delete by @tyler-dane in #2809
  • refactor: apply the code-simplification review (−1,640 net lines, behavior preserved) by @tyler-dane in #2810
  • fix(web): keep promoted recurring edits at the moved time by @tyler-dane in #2807
  • fix(sync): hide Google-deleted recurring instances by @tyler-dane in #2808
  • fix: surface first-import failures and stop retrying dead oauth grants by @tyler-dane in #2812
  • Replace the post-showcase checklist with a first-event handoff prompt by @tyler-dane in #2813
  • fix(web): show end-before-start time picker validation by @tyler-dane in #2811
  • fix(sync): refresh stale foreground connections by @tyler-dane in #2815
  • refactor(sync,backend): dedupe foreground refresh scheduling and enqueue by @tyler-dane in #2817
  • chore(backend): delete the unused concurrency limiter util by @tyler-dane in #2818
  • feat(web): show effective timezone in the grid corner by @tyler-dane in #2814
  • chore: bypass permissions by default for cloud sessions by @tyler-dane in #2819
  • feat(web): pin calendar timezone and thread it through the grid by @tyler-dane in #2816
  • feat(web): prompt when the pinned timezone differs from the device by @tyler-dane in #2820
  • fix(web): keep time unchanged when tabbing through picker by @tyler-dane in #2822
  • fix: stop a sync blip from storming the backend and filing issues by @tyler-dane in #2828
  • fix(web): hide jump labels for out-of-view events by @tyler-dane in #2827
  • feat: make keyboard only by @tyler-dane in #2830
  • fix(ci): surface autofix agent errors on manual dispatch by @tyler-dane in #2826
  • refactor(web): retire week draft provider and overlay bridge by @tyler-dane in #2831
  • feat(web): pan timed grid one hour with alt+arrows by @tyler-dane in #2832
  • Remove backend availability flag and local fallbacks; simplify BaseApi and repository logic by @tyler-dane in #2835
  • feat(web): add time travel second hour column by @tyler-dane in #2821
  • feat(web): teach shortcuts from blocked clicks by @tyler-dane in #2836
  • fix(web): keep pointer event hints executable by @tyler-dane in #2838
  • fix(web): align timed grid hour labels with events by @tyler-dane in #2840
  • fix(sync): stop the cursor-expiry repair storm, and make a dead push path loud by @tyler-dane in #2841
  • fix(sync): bound occurrence projection by document count, not event count by @tyler-dane in #2843
  • fix(sync): only alarm on push silence once it has held for an hour by @tyler-dane in #2844
  • fix(sync): measure push delivery with a durable timestamp by @tyler-dane in #2845
  • fix(web): let keyboard navigation reach read-only events by @tyler-dane in #2846
  • feat(web): pick event color and calendar by digit by @tyler-dane in #2847
  • fix(sync): put the sanitized cause in the job-failure error message by @tyler-dane in #2848
  • ci: add Lighthouse performance budget gate by @tyler-dane in #2851
  • fix(self-host): serve web assets with proper cache headers by @tyler-dane in #2854
  • fix(web): restore welcome showcase and tighten onboarding by @tyler-dane in #2850
  • perf(web): modulepreload boot-critical chunks in index.html by @tyler-dane in #2852
  • Jump event-form fields with Mod+digit, hint chips on hold by @tyler-dane in #2855
  • perf(web): lazy-load the event form so the editor stack skips boot by @tyler-dane in #2853
  • fix(docker): bump web images to bun 1.3.14 for build metafile by @tyler-dane in #2856
  • fix(web): clamp near-midnight timed drafts to end at midnight by @tyler-dane in #2859
  • fix(docker): create runtime user with groupadd on trixie bun images by @tyler-dane in #2857
  • fix(sync): accept 21+ repeated calendarIds params on the internal event read by @tyler-dane in #2860
  • fix(backend): report event-read Sync defects at error so they reach PostHog by @tyler-dane in #2861
  • fix(backend): log event mutation failures, not just reads by @tyler-dane in #2862
  • feat(web): reveal page-level jump targets while holding mod by @tyler-dane in #2863
  • fix(web): commit focused time on enter and raise option contrast by @tyler-dane in #2849
  • fix(web): match CefSharp scanner noise by shape, not fixed id by @tyler-dane in #2839
  • docs(agents): add temporary agent-os restructure pack by @tyler-dane in #2864
  • fix(scripts): align bun run verify with required CI checks by @tyler-dane in #2865
  • feat(agents): write typed handoffs in-repo instead of OS temp by @tyler-dane in #2866
  • feat(agents): split ship into Manager, review, and verifier by @tyler-dane in #2867
  • feat(scripts): enforce agent constraints in lint and PR body by @tyler-dane in #2868
  • feat(agents): add agent-ready GitHub issue intake template by @tyler-dane in #2869
  • feat(agents): version skills and add registry plus eval stubs by @tyler-dane in #2872
  • feat(scripts): document error-autofix as a governed routine by @tyler-dane in #2873
  • Allow-list all tool calls so cloud sessions stop prompting by @tyler-dane in #2874
  • chore(agents): remove temporary restructure pack by @tyler-dane in #2875
  • fix(sync): retire hidden google calendars and clear inactive channels by @tyler-dane in #2876
  • feat(web): polish welcome and expand shortcut practice by @tyler-dane in #2879
  • feat(web): always show the next sidebar shortcut by @tyler-dane in #2878
  • fix(web): sync month picker highlights with days in view by @tyler-dane in #2881
  • feat(web): notify 5 minutes before an upcoming event by @tyler-dane in #2871
  • fix(web): restore month picker capsule and match week start by @tyler-dane in #2883
  • feat(web): add book personal onboarding command by @tyler-dane in #2886
  • fix(web): preserve duration when event times invert by @tyler-dane in #2884
  • Revise README for clarity and grammar by @tyler-dane in #2882
  • chore: remove PR body ci check by @tyler-dane in #2889
  • feat(web): focus nearest event on unfocused arrow keys by @tyler-dane in #2880
  • Make shortcut practice more human by @tyler-dane in #2888
  • feat(web): share availability from day and week views by @tyler-dane in #2885
  • Add Product Suite Boundaries doc and link from docs README by @tyler-dane in #2877
  • docs(agents): add attendee-support work pack + autonomous delivery loop by @tyler-dane in #2870
  • refactor(web): simplify shortcut practice by @tyler-dane in #2890
  • feat(web): redesign share availability around keyboard repositioning by @tyler-dane in #2892
  • fix(sync): ride out transient mongo drain blips by @tyler-dane in #2893
  • feat(web): remove share availability feature by @tyler-dane in #2895
  • Add hold-Mod page jump hints to the Life view by @tyler-dane in #2894
  • feat(web): explain time travel and exit with escape by @tyler-dane in #2896
  • fix(web): place onboarding showcase sidebar on the right by @tyler-dane in #2897
  • feat(web): cycle sidebar shortcut tips after demonstrated primitives by @tyler-dane in #2898
  • fix(backend): keep the reason a Sync 200 body failed the contract by @PostHog[bot] in #2900
  • fix(billing): verify Stripe webhook signatures under Bun by @tyler-dane in #2905
  • Jump to events without first pressing S by @tyler-dane in #2909
  • fix(sync): give calendar-list rediscovery its own staleness clock by @tyler-dane in #2908
  • feat(web): show guest RSVP status and jump with e a by @tyler-dane in #2911
  • fix(sync): tolerate unknown keys when reading sync_resources by @tyler-dane in #2915
  • feat(web): add visible shortcuts to trial gates and action toasts by @tyler-dane in #2917
  • test(billing): cover webhook retry and unhandled-type paths by @tyler-dane in #2914
  • fix(billing): retire trial stamps left by the accidental enforcement window by @tyler-dane in #2919
  • fix(backend): keep the reason a Sync 200 body failed the contract on event reads by @tyler-dane in #2920
  • feat(billing): add an operator bypass allowlist for gated accounts by @tyler-dane in #2921
  • feat(web): smooth first-visit onboarding into shortcut practice by @tyler-dane in #2907
  • fix(ci): gate autofix sensitive paths at merge, not at authoring by @tyler-dane in #2923
  • feat(web): remap event jump to h and surface day prefixes by @tyler-dane in #2918
  • feat(web): drop hardcoded price and export from billing gate by @tyler-dane in #2922
  • fix(backend): close the SSE stream when the initial replay fails by @tyler-dane in #2925
  • docs(autofix): read exception environment via sql, not context groups by @tyler-dane in #2926
  • feat(web): open the view dropdown from hold-Mod page jump by @tyler-dane in #2929
  • feat(web): replace toast close control with esc dismiss tip by @tyler-dane in #2928
  • fix(web): style jump-mode Esc as a keycap by @tyler-dane in #2927
  • feat(web): expand shortcut practice with edge resize, undo, and legend by @tyler-dane in #2931
  • fix(web): make every form field targetable on hold-Mod by @tyler-dane in #2930
  • fix(web): bind discard unsaved changes to Mod+Enter by @tyler-dane in #2932
  • feat(web): open the sandbox to anonymous users, soften the trial gate by @tyler-dane in #2934
  • fix(web): show Mod+R on the update-available tooltip by @tyler-dane in #2936
  • ci: let docs-only PRs satisfy their required checks by @tyler-dane in #2938
  • ci: report per-leg unit contexts when the suite is skipped by @tyler-dane in #2940
  • chore(agents): close out the 2934 ship ledger row by @tyler-dane in #2939
  • feat(web): add month picker Mod+Shift+J/K shortcuts by @tyler-dane in #2935
  • feat(web): personalize shortcut suggestions by @tyler-dane in #2943
  • feat(web): add day-view column jump targets by @tyler-dane in #2942
  • fix(web): apply recurring form saves to this event by @tyler-dane in #2933
  • refactor(web): drop the Shift+F10 row from the shortcuts legend by @tyler-dane in #2941
  • fix(web): teach Shift+up/down for timed edge resize by @tyler-dane in #2944
  • fix(web): left-to-right hold-Mod chips and month-picker nav by @tyler-dane in #2945
  • fix(web): unstick onboarding at the shortcut legend by @tyler-dane in #2946
  • fix(web): keep billing-gate L from opening Life view by @tyler-dane in #2949
  • feat(billing): add a trial countdown badge and let users subscribe early by @tyler-dane in #2947
  • feat(web): celebrate the checkout return and surface the plan by @tyler-dane in #2948
  • refactor: strip unused hint metadata and dead startTrial by @cursor[bot] in #2951
  • feat(web): lead the upgrade dialog with one Premium call to action by @tyler-dane in #2952
  • feat(web): teach day columns with Shift and stop truncating the tip by @tyler-dane in #2954
  • fix(web): nest Compass calendar under matching Google account by @tyler-dane in #2953
  • feat(web): lower the welcome first-action bar by @tyler-dane in #2956
  • Split Settings billing and fix subscribe shortcuts by @tyler-dane in #2955
  • fix(web): restore grid focus after event form save by @tyler-dane in #2957
  • fix(billing): make account deletion payment-safe by @tyler-dane in #2958
  • fix(auth): request only verified google scopes by @tyler-dane in #2959
  • refactor(web): share day-jump vocabulary and billing helpers by @cursor[bot] in #2960
  • fix(backend): preserve Stripe webhook raw body for HMAC by @tyler-dane in #2961
  • feat(web): replace event form kebab with a discoverable action row by @tyler-dane in #2962
  • feat(web): confirm showcase skip and resume progress by @tyler-dane in #2963
  • feat(web): copy and paste events with Mod+C / Mod+V by @tyler-dane in #2964
  • feat(web): create events at a typed time by @tyler-dane in #2965
  • feat(web): teach t shortcut on month picker today control by @tyler-dane in #2966
  • refactor(web): share grid edit guards and simplify form actions by @cursor[bot] in #2967
  • fix(web): close Start Premium dialog on Escape by @tyler-dane in #2979
  • docs(booking): lock v1 spec and add unattended booking-loop by @tyler-dane in #2969
  • fix(web): fire upcoming event alerts on Life and after tab wake by @tyler-dane in #2980
  • feat(core): booking Zod contracts (WP-01) by @tyler-dane in #2981
  • feat(sync): derive occurrence busy from provider transparency (WP-02) by @tyler-dane in #2982
  • fix(scripts): retry booking loop after quota reset by @tyler-dane in #2983
  • fix(scripts): merge booking prs without auto-merge by @tyler-dane in #2985
  • feat(backend): booking page persistence and slug (WP-03) by @tyler-dane in #2984
  • feat(core): booking slot engine (WP-04) by @tyler-dane in #2986
  • feat(booking): calendar application port (WP-05) by @tyler-dane in #2988
  • Let guests be edited on repeating events by @tyler-dane in #2989
  • feat(web): give each calendar account a hold-Mod jump key by @tyler-dane in #2987
  • feat(web): host Settings booking UI (WP-07) by @tyler-dane in #2991
  • feat(backend): public booking guest API (WP-06) by @tyler-dane in #2990
  • feat(web): public guest booking page (WP-08) by @tyler-dane in #2992
  • test(booking): e2e specs and docs closeout (WP-09) by @tyler-dane in #2993
  • fix(booking): stop response-only keys from killing every save after the first by @tyler-dane in #2995
  • feat(booking): default the booking timezone to the host's own zone by @tyler-dane in #2996
  • refactor(web): share quick-time busy mapping and tidy shortcut owners by @cursor[bot] in #3012
  • fix(web): restore scrolling on the public booking page by @tyler-dane in #2994
  • feat(booking): pick the booking timezone with the app's searchable combobox by @tyler-dane in #2997
  • feat(booking): type weekly hours as ranges instead of 21 tab stops by @tyler-dane in #3013
  • fix(booking): clamp guest slot window to the host horizon by @tyler-dane in #3014
  • fix(booking): require confirm before canceling a reservation by @tyler-dane in #3016
  • Stop the remaining test module mocks and spies from leaking by @tyler-dane in #3015
  • fix(booking): keep guest details and focus the alert on slot conflict by @tyler-dane in #3018
  • feat(booking): jump between booking fields with the e leader by @tyler-dane in #3017
  • feat(booking): copy the booking link automatically after a save by @tyler-dane in #3020
  • perf(booking): fetch slots per month with stable cache keys by @tyler-dane in #3019
  • feat(booking): add an accessible month grid to the guest page by @tyler-dane in #3021
  • feat(booking): two-pane picker (month grid + day slot list) by @tyler-dane in #3022
  • feat(booking): slot-to-details flow with summary, focus, and change-time by @tyler-dane in #3023
  • feat(booking): loading skeletons and live announcements for guest slots by @tyler-dane in #3025
  • feat(web): guest timezone override on public booking by @tyler-dane in #3026
  • feat(web): respect prefers-color-scheme on public pages by @tyler-dane in #3027
  • refactor(booking): remove duplication left by the WP-01..WP-09 booking merges by @tyler-dane in #3024
  • feat(booking): confirmation permalink that survives refresh by @tyler-dane in #3029
  • fix(web): restore the booking date-key call sites broken by #3024 by @tyler-dane in #3030
  • feat(web): keyboard skip link and focus audit for public booking (#3005) by @tyler-dane in #3031
  • docs(booking): e2e and docs closeout for the UX overhaul (#3009) by @tyler-dane in #3032
  • refactor(booking): delete the v1 pack and simplify guest/host scaffolding by @tyler-dane in #3033
  • fix(web): keep e then t on title while event jump is on by @tyler-dane in #3028
  • test(web): fix booking slot-loading status race in PublicBookingPage tests by @tyler-dane in #3035
  • fix(web,backend): delete account without a stale-login toast by @tyler-dane in #3037
  • feat(web): join up next meeting with v from anywhere by @tyler-dane in #3034
  • refactor: simplify maintenance workflows by @tyler-dane in #3039
  • fix(booking): unbrick the public page, close the overlap race, and polish the guest UX by @tyler-dane in #3040
  • fix(web): let tab reach every event form action by @tyler-dane in #3041
  • Teach the clicked time's shortcut on empty grid clicks by @tyler-dane in #3042
  • refactor: reuse shared booking and up-next helpers by @cursor[bot] in #3044
  • fix(booking): contain overflow, cut slot keystrokes, and hide in production by @tyler-dane in #3043
  • Replace the lesson showcase with the Schedule Rush onboarding game + activation-funnel fixes by @tyler-dane in #3036
  • fix(web): drop duplicate openToDate on the ends-on picker by @cursor[bot] in #3045
  • refactor(booking): cache guest page formatters and reuse the slots query key by @tyler-dane in #3046
  • feat(onboarding): rework Schedule Rush into Block Party by @tyler-dane in #3047
  • fix(onboarding): reactive discovery chips and end-screen-only timed start by @tyler-dane in #3048
  • feat(web): allow pointer clicks on the life page by @tyler-dane in #3049
  • fix(web): focus email when login and signup open by @tyler-dane in #3051
  • fix(web): let mobile users tap copy and waitlist by @tyler-dane in #3052
  • fix(web): peel settings on escape and defer reconnect during trial gate by @tyler-dane in #3061
  • fix(web): map 1200 shortcut to noon by @tyler-dane in #3062
  • feat(web): add shortcuts for start-trial and reconnect banners by @tyler-dane in #3050
  • fix(web): bind reconnect banner to G instead of 1 by @tyler-dane in #3064
  • feat(booking): availability exceptions and page identity by @tyler-dane in #3063
  • fix(web): recover staging billing lifecycle by @tyler-dane in #3067
  • test(e2e): date-override slots and settings save by @tyler-dane in #3066
  • fix(web): allow pointer billing actions by @tyler-dane in #3068
  • feat(billing): surface a trial's scheduled cancel by @tyler-dane in #3069
  • fix(web): smooth re-entry for returning users by @tyler-dane in #3072

Full Changelog: v1.1.0...v1.2.0