Repository navigation
v1.2.0
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