What's Changed
- rules: do not learn sender exclusions from bulk label removals by @elie222 in #3468
- fix: avoid learning sender exclusions from isolated label removals by @elie222 in #4373
- rules: Add PostHog events for rule changes by @elie222 in #4374
- assistant: Let chat test rule fixes against the email being fixed by @elie222 in #4375
- mail: Let Gmail collapse quoted replies to messages sent from the app by @elie222 in #4376
- mail: Show sender header hover icons together by @elie222 in #4378
- mail: Copy one-time codes from the thread list and push notifications by @elie222 in #4377
- ci: Feature relevant Playwright frames and let agents embed them in PRs by @elie222 in #4379
- gmail: Archive every message from a sender, not every other page by @amartya1523 in #4380
- mail-sqlite: Replay pending changes in submission order so undo shows correctly by @amartya1523 in #4384
- rules: Keep notifications on other channels when saving a rule by @amartya1523 in #4382
- meeting-briefs: Don't brief on meetings or guests that declined by @amartya1523 in #4381
- outlook: Mark the subscription lapsed when renewal can't replace it by @amartya1523 in #4364
- senders: Stop one sender's filter matching another's address by @amartya1523 in #4362
- cold-email: Honour "Not a cold email" for senders with capitals in their address by @amartya1523 in #4361
- docs: explain how to turn on the decision model (Jev, Clef) by @elie222 in #4385
- digest: Send one digest after a stale schedule, not one per cron run by @amartya1523 in #4363
- tests: Stabilize choose-rule model evals by @gentlemandev in #3068
- mail: Show star, read, and label changes instantly by @elie222 in #4389
- mail: Pass Shift and Cmd shortcuts through from the email body by @elie222 in #4388
- mail: Stop cutting emails at an inline "original message" by @amartya1523 in #4383
- mail-core: Give every folder a turn during a large mailbox's first sync by @elie222 in #4387
- Sort labels with numeric prefixes naturally (10 after 9, not after 1) by @rizzmonkey in #4347
- clean: Keep starred and replied threads that start with a newsletter by @amartya1523 in #4342
- booking: Check the host's calendars for the exact slot being booked by @amartya1523 in #4332
- INB-394: Stop HTML signatures from gaining extra spacing in Gmail drafts by @elie222 in #4391
- test: Fix package test cache race and Node 26 SQLite failure by @elie222 in #4390
- messaging: Show draft replies without raw HTML signatures in Slack and Telegram by @elie222 in #4392
- cli: Detect ports held on wildcard addresses and prompt for a free one by @chrisbull in #4370
- drafts: Don't record a reply as a sent AI draft after we deleted the draft by @amartya1523 in #4333
- llm: Let self-hosters turn thinking off for Ollama and OpenAI-compatible models by @Calakai in #4350
- mail: Show mail in the Important split by @elie222 in #4393
- snooze: Stop retrying snoozes for threads that were deleted by @elie222 in #4396
- calendar: Query Google free/busy in batches of 50 calendars by @elie222 in #4397
- image-proxy: Pass through upstream 204/205/304 responses without a body by @elie222 in #4398
- bulk-unsubscribe: Don't crash when a bulk run outlives the SWR provider by @elie222 in #4399
- team-comments: Load shared email HTML on Vercel without require(esm) by @elie222 in #4400
- sentry: Ignore browser extension, in-app browser, and ad-blocker errors by @elie222 in #4401
- mobile-auth: Log why a mobile sign-in start fails by @elie222 in #4403
- outlook: Keep Reply-To, sender name and every recipient on outgoing mail by @amartya1523 in #4334
- shortcuts: Cycle mail splits backward with Shift-Tab by @bitbirddev in #4405
- fix(assistant): demand mail engine when expanding inline email preview by @ghazy2001 in #4395
- docs: changelog — Oct 20 to Oct 30 entries by @cursor[bot] in #4270
- filing: Create nested folders inside existing filing folders by @afonsojramos in #3761
- mail: Resume sends parked on an expired token once the account reconnects by @amartya1523 in #4341
- llm: Replace the models api.groq.com retired by @elie222 in #4406
- rules: Stop silently dropping actions that have an unsupported delay by @amartya1523 in #4343
- messaging: Send a Slack/Telegram draft reply only once by @amartya1523 in #4344
- ai: Fix provider compatibility for email translation by @gentlemandev in #3142
- contacts: Report missing contact access as a success state, not a 403 by @gentlemandev in #3947
- fix: keep onboarding responsive during background mailbox scans by @arnav4393 in #4203
- mail: Let users drag accounts into order in the account switcher by @AstonAtomUCT in #4346
- chore: Stop gitleaks flagging YOUR_* placeholders in docs by @elie222 in #4408
- llms: Move CLI providers onto an adapter registry by @elie222 in #4409
- llm: Groq GPT OSS reasoning effort and pricing by @elie222 in #4386
- docs: changelog — File Into Subfolders (Oct 31) by @cursor[bot] in #4407
- Named signatures: pick a signature when composing, find them in sent mail by @elie222 in #4412
- chat: Calm assistant chat typography and collapse repeated tool rows by @elie222 in #4414
- assistant: Keep unsent text when a chat message fails to send by @elie222 in #4413
- chat: Stop the first message of a new chat from being aborted by @elie222 in #4416
- mail: Keep the reply editor in place while its draft saves by @elie222 in #4417
- loops: Treat 'already in your audience' as an existing contact by @elie222 in #4419
- email: Keep invoice email retries identical for Resend idempotency by @elie222 in #4422
- outlook: Ask users to reconnect when token refresh fails with AADSTS135010 by @elie222 in #4423
- billing: Skip seat updates for Stripe subscriptions that no longer exist by @elie222 in #4432
- automation-jobs: Skip scheduled runs for disconnected email accounts by @elie222 in #4433
- image-proxy: Return 502/504 when the upstream image host fails or stalls by @elie222 in #4420
- mail-engine: Restart sync lanes the device slept through without reporting them by @elie222 in #4429
- calendar: Query Google free/busy in batches of 20 calendars by @elie222 in #4421
- contacts: Skip Google contact search for queries over 100 characters by @elie222 in #4436
- billing: Record Stripe cancellation reason and feedback on cancellation events by @elie222 in #4440
- outlook: Treat Graph 5xx outages as known provider errors by @elie222 in #4430
- outlook: URL-encode $search so "#" and "&" don't cut queries off by @elie222 in #4434
- outlook: Treat unwatching an already-removed subscription as done by @elie222 in #4435
- outlook: Route mailbox throttling through rate-limit handling by @elie222 in #4437
- onboarding: Send users with missing Gmail permissions to reconnect before setup by @elie222 in #4439
- meeting-recorder: Batch per-account queries in the schedule cron by @elie222 in #4438
- Update marketing submodule by @elie222 in #4442
- webhook: Stop Gmail history processing once the account loses credentials by @elie222 in #4424
- test: Warm post-login routes before the emulated account picker click by @elie222 in #4431
- actions: Show a clear message when Gmail isn't available for an account by @elie222 in #4427
- follow-up: Scan labeled threads without message bodies by @elie222 in #4428
- llm: Treat retired models and spent AI budgets on user keys as config errors by @elie222 in #4426
- Suggest signatures found in sent mail from a sidebar card by @elie222 in #4443
- outlook: Skip missing messages instead of failing the whole message batch by @elie222 in #4444
- mail: Fix undo and trash races behind flaky triage E2E specs by @elie222 in #4445
- docs: Recommend keeping the self-hosted host OS patched by @elie222 in #4446
- watch: Stop renewing mailboxes that can't be watched by @elie222 in #4425
- Clean up tracked follow-up drafts safely by @elie222 in #4080
- db: Index draft actions by executed rule for draft cleanup by @elie222 in #4448
- outlook: Retry conflicting flag and read writes; quiet expected errors by @elie222 in #4447
- deps: Bump undici overrides to patched 6.29.1 and 7.30.1 by @elie222 in #4450
- billing: Store Stripe cancellation survey answers by @elie222 in #4449
- deps: Bump better-auth to 1.7.14 by @elie222 in #4451
- digest: Self-send digests when Resend is not configured by @elie222 in #4453
- brand: Add a brand kit page and logo right-click menu by @elie222 in #4455
- billing: Drop always-empty cancellation feedback from the initiated event by @elie222 in #4458
- onboarding: Resume setup after reconnecting from the missing-permissions prompt by @elie222 in #4457
- mail: Add an Unsubscribe button to the reader toolbar by @elie222 in #4460
- mail: Fix snooze autocomplete for partial dates by @elie222 in #4463
- feat(mail): add side chat with current email context by @elie222 in #4464
- mail: Send and open HTML mail without waiting on the network by @elie222 in #4462
- mail: Show remote-image emails at once and resume body downloads after reload by @elie222 in #4466
- mail: Remove a replaced draft on the server, even after the tab closes by @elie222 in #4467
- mail: Fetch opened bodies first, schedule at once, and cover more latency scenarios by @elie222 in #4468
- chore: Remove finished one-off scripts by @elie222 in #4471
- Record rule analytics only after the write succeeds by @elie222 in #4472
- Record the actual created folder path for OneDrive filings by @elie222 in #4478
- Stop on stale screenshot runs and catch duplicate CLI ports by @elie222 in #4479
- Match semicolon-separated senders in Gmail filter criteria by @elie222 in #4474
- Only offer an OTP copy code from the latest message by @elie222 in #4475
- drafts: Stop auto-cleaning AI drafts after an account disconnects by @elie222 in #4465
- chat: Show the attached email as a card inside the input by @elie222 in #4481
- db: Re-analyze ExecutedAction and ExecutedRule more often by @elie222 in #4485
- deps: Bump better-auth to 1.7.16 for security fixes by @elie222 in #4486
- Fix footer AI Email Assistant link by @elie222 in #4469
- deps: Refresh workspace dependency versions by @elie222 in #4488
- auth: Replace @better-auth/expo with a native auth plugin by @elie222 in #4487
- ui: Shorten snippet picker empty-state copy by @elie222 in #4491
- desktop: Host each window's page in a tab view by @elie222 in #4492
New Contributors
- @rizzmonkey made their first contribution in #4347
- @chrisbull made their first contribution in #4370
- @Calakai made their first contribution in #4350
- @bitbirddev made their first contribution in #4405
- @ghazy2001 made their first contribution in #4395
- @arnav4393 made their first contribution in #4203
- @AstonAtomUCT made their first contribution in #4346
Full Changelog: desktop-v0.1.22...desktop-v0.1.23