refreshMailInbox() resets/invalidates emails-infinite and refetches list, folders, accounts, and filter badge counts in one pass.new-email: immediate refreshListNow({ resetPages: true }) — no debounce; new mail always lands on page 1.GlobalMailSSE: useMailPeriodicRefresh — 30 s fallback poll keeps list and counters in sync when SSE is down.refetchInterval on useAccounts/useFolders; dropped 120 s list poll (4 s syncWarmup only during initial sync).emails_bulk_updated forwarded in sse.go (Redis + EventBus); frontend already listened but server never published to browser stream.folder_updated: frontend handler triggers atomic meta refresh.resetAccountSync: InvalidateEmailCache + RefreshUnreadCounts + SSE emails_bulk_updated (action: reset_sync).OnNewEmail: MemCache invalidation without Redis (Mono).removeQueries(["emails-infinite"]) on reset sync; GlobalMailSSE in app layout; syncWarmup fast-poll while list <40 emails.scheduleListRefresh replaces blocking fetchingRef — list no longer stuck at first SSE batch.RefreshUnreadCounts: tag smart_category first; inbox unread excludes smart-category emails (matches list view).buildFilterWhere / GetEmailCount: same exclusion for toolbar badges vs sidebar.email-folder-counts.normalizeEmailHTML → wrapEmailForIframe; XSS boundary is iframe srcdoc CSP.sanitizeNode in email_normalize.go; tests updated.emailHoverCursor on iframe overlay (pointer on links/buttons, zoom-in on images); coreStyles + .email-simple-content CSS.GetActiveFilePaths: removed LIMIT 10000 (SQLite + Postgres) — GC no longer treats valid .eml files as orphans on large mailboxes.syncInboundFlags: ~30 s poll — FETCH FLAGS for 300 recent clean messages; \Seen / \Flagged / \Answered server → DB (read/unread both ways + unread_count).ApplyServerEmailFlags: atomic apply without is_dirty_locally; replaces read-only inbound path.syncFlags: \Seen, \Flagged, \Answered batched STORE (200 UIDs); dirty rows carry all three fields.emails.is_answered; model + API is_answered.MarkEmailAnsweredByMsgID on send (in_reply_to) → dirty → IMAP \Answered.\Flagged / \Answered on new message fetch.email_updated with flag fields; MemCache invalidation without Redis (Mono).email_updated.UnilateralDataHandler on CheckWorker — EXISTS wakes IDLE loop → checkNewEmails (was unwired wakeUp channel).IDLETimeout + IDLEWatchdog from timing.go (replaces hardcoded 14 min-only refresh).syncNonInboxFolders every FolderScanInterval (5 min / 2 min Mono) in consumer loop.syncFlags: clear is_dirty_locally only after successful STORE for folder.RunRules in ProcessMessageStreamToFolder only when isNewEmail.GetEmailIDByFolderUID + local DeleteEmail when server has no UID.last_sync_uid after enqueue.resolveDraftsFolder() for localized / SPECIAL-USE mailbox names.syncBatchDelay: throttling between folder sync and enqueue batches.UPDATE_CHANNEL baked at image build (stable / beta); normalizeUpdateChannel() on license ping.maxramas/rms-mail; edition + role in tag {m|u|t}[-ui]-{latest|beta|test|semver}.m-latest, m-ui-latest, u-beta, m-test, u-3.0.7.bp-*.sh, beta-*.sh, build-and-push-test.sh, all docker-compose-*.yml.rms-mail-m, rms-mail-m-ui, … and legacy latest-m / rms-mail-ui:latest-m.WakeUpAccountNow: immediate sync consumer wake (IDLE push, open email, user actions) — no jitter; WakeUpAccount keeps 0–30 s jitter for restarts.RequestFlagRefresh: open email → queue for next inbound FETCH FLAGS + WakeUpAccountNow.inboundFlagSyncLimit 2000 per account (was 300).PurgeEmailLocalFiles before DeleteEmail when server UID is gone — encrypted body removed from disk.{ "event": "email.received", "email": { ... } } (WebhookEventPayload).has_secret on webhook API; UI (signed) indicator — secret never listed.RunRules only on new ingest (isNewEmail) — no duplicate rule runs on re-sync.accountId.?token=: HTTP 400 everywhere except /mcp/* legacy SSE.is_answeredIF NOT EXISTS migration 023 could skip column on LibSQL while marking applied → /api/emails500.addColumnIfMissing + ensureMonoEmailColumns on startup; migration 023 plain ADD COLUMN.TestInitSchemaRepairsMissingIsAnswered.email-viewer subcomponents; mail-inbox-layout + inbox hooks; api-client.ts.is_answered UI + SSE flag cache patches.:3000 (Next rewrites /api, /mcp, /internal).requestPublicBaseURL() — FRONTEND_URL + X-Forwarded-*; MCP SSE message URLs HTTPS-safe.reverse-proxy.md — Mono / Unified production proxy (aaPanel, nginx).<meta> from email fragments (iframe viewport console warnings).; (SQLite migration splitter).mcp-tab render-time key resolution (ESLint CI).IMAP_PER_HOST_CONN limits concurrent dials per host; IDLE/sync sessions no longer hold slots (fixes Gmail multi-account slot timeouts at cap ≈ 2×accounts).50 silently fell back to default 10)..env: IMAP_PER_HOST_CONN, sync pool vars wired in all prod/test compose files + examples.last_sync_error shows real failure; invalid_grant → fatal (re-authorize); immediate reconnect after token refresh (SyncWorker + CheckWorker).