Changelog
What's New
All the latest updates, features, and fixes.
Never-Track List, Consistent Pickers, and Private Image Loading
- Manage your never-track list in Privacy settings. Anyone on it stays untracked, including on scheduled sends.
- Send Later, Remind Me, Labels, Move to folder, and View Original all open as the same centered card now, and cancelling one takes you back to the command palette.
- Threads tell you how many trackers were blocked.
- Un-archive is a real action you can run on any thread.
- Remote images load through Hyperdrive instead of the browser engine and are cached so they appear instantly next time. The cache is readable only by you.
- Timestamps update right away when you switch between 12- and 24-hour time.
- Fixed a scheduled send leaving the composer open, Send Now not sending, undo not fully reversing a send, and reopening a draft blanking it.
Drag-and-Drop Attachments, a Resizable Composer, and Full Activity History
- Drop a file on the composer to attach it. Labeled targets show whether it lands as an attachment or inline in the body.
- Drag the composer's top edge to whatever height you want, and it stays there until you change it.
- Activity now scrolls back through an account's entire history, loading more as you go, and refreshes the moment you launch or switch accounts.
- Stop tracking a single recipient, a whole domain, or an email you already sent.
- Fixed attachments failing to send.
- Fixed the composer never reopening after you collapsed it out of full screen, and a faded draft card swallowing clicks meant for the composer.
- Fixed a reply going to the wrong message, and a deleted draft coming back.
Draft Card, Scheduled Folder, and Tracking Controls
- Your unfinished message now sits in a card at the bottom of the thread. It slides open into the composer and back, and has its own Trash button.
- Scheduled messages wait in a Scheduled folder instead of cluttering Drafts, and the draft clears itself once the message goes out.
- Turn read receipts and link tracking on or off from the command palette or Privacy settings.
- Read a sender's mail exactly as they sent it, every time. Choose View Original for one thread or for that sender from then on.
- Deleting your account now takes an emailed confirmation before anything is removed.
- Light mode was retuned so the reading pane and side pane are easier on the eyes.
- Fixed Archive, Trash, and Mute acting on the wrong thread while a message was open, and New Message not opening after an abandoned draft.
One-Click Unsubscribe, Image Blocking, and View Original
- Unsubscribe from a mailing list in one click. A banner at the top of qualifying emails unsubscribes you, then archives the thread and blocks the sender so it stays gone.
- Block remote images by sender. When an email loads tracking images, a banner lets you load them once, always for that sender, or never.
- See any email exactly as it was sent. Press D on a thread to toggle View Original and read the raw, unstyled message, then toggle back.
- Drafts are clearer in your lists. Unfinished messages show a "[Draft]" tag in the thread list and search, and composing no longer bumps a thread to the top.
- Sign back in cleanly when a session expires. Hyperdrive now recognizes an expired sign-in, says so plainly, and walks you through re-authorizing.
- Fixed incremental sync dropping or misparsing some newly arrived mail.
Readable Dark-Mode Email and RSVP Reliability
- Dark-mode email is easier to read. Body text was lifted out of a too-dim grey, and each message keeps its own formatting on its own card.
- RSVPs are more reliable. Your response sends through the account's own provider, saves once, and the banner shows when a reply hasn't gone through yet.
- The side pane grows with your window. The widget pane and its tabs now expand and space themselves evenly as you resize.
- Fixed several dark-mode cases where message backgrounds or images washed out the text.
Meeting Invites in the Thread, Dark-Mode Fixes, and Full-Screen Compose
- Calendar invites show a banner right in the thread. Accept, decline, or open the event without leaving the email, read straight from the invitation.
- Dark mode reads correctly across more emails. Link colors, backgrounds, low-contrast text, and embedded images are handled so nothing disappears against a dark background.
- Reply full-screen when you want room. The composer gained a full-size toggle and can host a live reply or forward draft.
- The quoted original is editable and collapsible. Reply quotes seed into the editor as a block you can trim or expand instead of being tacked on at send.
- Resume a draft exactly where you left off. Drafts reopen by their own identity, including threaded reply and forward drafts.
- Fixed a flash where a thread briefly showed the previous email before painting.
Auto Draft, a Tasks Panel, and a Reading Gutter
- Let AI draft your reply. Auto Draft reads the thread and writes a reply in your voice, with a waiting indicator while it works, ready for you to edit and send.
- Drafts stay in sync. Drafts you edit or delete elsewhere are reconciled on sync, and empty drafts are kept out.
- A new Tasks panel. Track tasks in a dedicated side panel alongside your mail.
- A reading gutter for a narrower column. A collapsible left panel lets you tighten the reading width for long messages.
- The thread header is cleaner. The action bar folded into the subject row with smaller glyphs.
AI Reasoning Controls and Scheduling Link Polish
- AI features are tuned per task. Thread summaries run faster with reasoning off, while compose and classification keep it on for accuracy.
- Thread summaries are terser. The summary prompt drops boilerplate and keeps a tight history.
- The scheduling link editor matches the event panel. Creating and editing links now share the same clean layout.
- Reminders return you to the top of the inbox. Restored the original behavior where a reminder leaves the inbox and comes back on top.
- Fixed a crash on quit during shutdown of the on-device AI engine.
Drag to Edit Calendar Events and AI Rewrite Polish
- Create and edit events by dragging on the calendar. Drag on the grid to create, drag to move, and drag an edge to resize — on timed events, all-day rows, and the month view.
- The AI Rewrite panel gained a real editor. Rewrites open in a live, editable box you can undo in one step, with clear keyboard focus.
- The inline reply card is a proper floating card. It sits as a bounded card whose height grows elastically as you type.
- The event detail view was reorganized. Edit and Delete moved to clearer spots and the panel reads as a single tidy column.
- Fixed the calendar grid dragging the whole window on press-and-hold.
Drag Images Into Your Message and Smart Event Titles
- Drop an image straight into your message to embed it inline. Drag a photo onto the Composer and the drop zone splits so you can choose to attach it or place it inline in the body, whichever half you release over.
- Inline images just work, whatever the format. HEIC, TIFF, and similar formats are converted automatically when you drop them in, and if one can't be converted it falls back to an attachment with a heads-up.
- Events suggest their own title. As you fill in an event, Hyperdrive offers a smart title suggestion you can accept or dismiss from the keyboard.
- Fixed the event editor's tab order to follow the two-column layout, and tidied the AI settings model rows so labels sit left and buttons line up flush right.
Redesigned Event Editor and a Downloadable AI Model Library
- The event editor was redesigned into a clean two-column form. Calendar, Recurrence, and Location are always visible, the all-day toggle now sits on the Title row, and viewing and editing an event share the same tidy layout.
- Bring your own AI, with models you can download on device. The AI settings tab now includes a model library with clear download progress, plus proper dropdowns for choosing your provider and model.
- Small polish: the sync confirmation emoji is now centered on the sync dot.
Remind Me Everywhere, Drag-to-Attach, and Bring Your Own AI Key
- Set a Remind Me on a brand-new message, not just replies. The reminder arms the moment you pick it, rides along when the message sends, and cancels itself if you discard the draft.
- Schedule and reminder chips each get their own cancel button. When a message has both a scheduled send and a reminder, they show as two separate chips you can cancel independently.
- Drag files onto the Composer to attach them. Drop one or more files directly on the compose card and they're added to your message.
- Bring your own AI provider key. A new AI settings tab lets you choose your provider and enter your own API key, stored securely.
- Snooze is now part of Remind Me. Snoozing and reminders were merged into one simpler system, so there's a single way to bring a thread back when you want it.
- Event notes gained a taller two-line field, with a paperclip button to attach files right from the editor.
AI Rewrite, Richer Calendar Events, and Scheduled Send Chips
- Rewrite your draft with AI. A new Composer panel rewrites selected text and lets you steer the result by tone, with full keyboard control for cycling fields and stepping through tones.
- Choose your AI provider. Hyperdrive now runs AI features through a provider you select, and switching providers takes effect immediately on your next request.
- Calendar events gained real depth. Events now support all-day toggling, precise start and end times, time zones, availability and visibility settings, reminders, and attachments — on both the events you create and the ones you sync.
- New Calendar settings tab. Set your default event duration once and every new event picks it up.
- Scheduled sends show a chip in the Composer. When a message is queued to send later, a chip displays the scheduled time and cancels the send when clicked.
- Recipient chips toggle on click. Click a chip to swap between a contact's display name and their email address.
- Fixed daily celebration photos being downloaded larger than needed, and kept the celebration on screen when you re-enter quickly.
Link Previews, Consistent Lists, and Composer Polish
- See where a link goes before you click. Hovering a link in the Composer now shows a popover with its destination address.
- Every list in the app now behaves the same. Date presets, contact suggestions, dropdowns, and the schedule picker all share one list foundation, so selection, hover, and scrolling feel identical everywhere.
- Recipient chips show contact names. Chips now display a contact's display name instead of a raw address, with labels optically centered.
- Insert Link moved to Shift+Cmd+K to free up its previous shortcut.
- Hover behavior is more precise across dropdowns and contact suggestions, and rows now show a proper cursor.
- Fixed a list cursor flicker, keyboard hint bar spacing, and your text selection and focus not returning after the link sheet closes.
New Dropdowns and a Cleaner Date Picker
- Dropdowns are new across the app. They are fully keyboard navigable, respond to hover on both label and chevron, and size themselves to their content.
- The Send Later and Remind Me picker was redesigned. The date input and condition controls were rebuilt, spacing and dividers were corrected, and the wording reads properly now.
- Panel styling is consistent app-wide. Every floating panel, palette, and picker now draws from one shared set of styling rules.
Send Later, Remind Me, and a Fuller Accounts Tab
- Schedule a message or set a reminder from the Composer. A new picker lets you send later or remind yourself, including conditional reminders.
- Reminders that fire only if no one replies. Schedule a follow-up and it cancels itself automatically when a recipient replies first.
- Resume a draft straight from the thread. Pending sends and drafts now appear inline in the conversation, and clicking one reopens the Composer where you left off.
- The Accounts tab does much more. Pick a color per account and per calendar, see your calendars nested under the account they belong to, and connect or disconnect Slack workspaces and Zoom.
- Lists follow your cursor. The date picker, recipient suggestions, and command palette now scroll to keep the selected row in view, including when opened mid-list.
- Buttons are consistent app-wide, and recipient fields now show placeholder text.
- Fixed crashes when dismissing the schedule and snooze pickers, a Remind Me shortcut that did nothing, and drafts losing their conversation on autosave.
Text Color, Links, Account Management, and Instant Theming
- Color your text. A swatch picker sits under the paint palette button in the Composer, and the button's dot reflects the color at your cursor.
- Insert and edit links properly. A new link sheet applies to your selected text and lets you edit an existing link in place.
- The Accounts tab was rebuilt. Accounts are grouped by provider with connection badges, shortcut hints, and working Add and Remove actions.
- Reconnecting a disconnected account now just works. If a provider revokes access, Hyperdrive flags that account, offers a clear re-authorize action, and picks your mail back up afterward without a full resync.
- Signing out fully clears your data. Sign-out now revokes access, ends the session, and purges that account's local data in order.
- Theme changes apply everywhere, instantly. Switching palettes or typography now repaints every surface in the app at once, with no stale colors left behind.
- Security hardening across sign-in and account data handling.
- Fixed the After Archive dropdown clipping and lagging, the Composer caret not blinking when refocused, numbered and bulleted list styling in the editor, and floating panels flashing or landing off-center.
Collapsible Calendar Sections, Compose Reliability, and Sync Status Polish
- The calendar sidebar is now collapsible. Calendars and Scheduling Links each have reusable disclosure headers, smooth open/close animation, and their expanded state is remembered between launches.
- Keyboard control added for calendar sections. You can toggle the sidebar sections from the keyboard, with layout and animation routed cleanly through the shared app model.
- Compose autosave and focus behavior tightened up. Draft autosave now runs through the main-thread dispatcher seam, recipient data is serialized correctly, and focusing the editor places the caret at the end of your existing text.
- Status bar sync feedback is clearer. Sync now shows distinct Synced, Syncing, Offline, and Error states, including a per-poll spinner signal while background work is active.
- Multi-account visuals are more stable. Each account now gets its own color slot at sign-in, and older accounts are backfilled automatically so account colors stay distinct.
- Settings and build polish. Fixed the General settings appearance section collapse behavior, corrected light-mode recoloring there, restored the Hyperdrive app name and icon in the active Mac build, and persisted the OAuth URL scheme in project generation.
Scheduling Link Editing and Calendar Sync Reliability
- Edit scheduling links from the list. The pencil icon opens the editor prefilled with the link's current settings, and saving updates it in place instead of creating a new one.
- Confirmation dialog before deleting a scheduling link. A new reusable confirmation overlay asks you to confirm before the link is removed.
- Fixed calendar sync. A pagination bug was causing full calendar refreshes to fail with a server error; incremental sync is enabled again too.
- Scheduling credentials now provisioned securely at app launch, stored in the protected keychain instead of being created the first time you open the editor.
- Account activation now waits for valid credentials, preventing an account from silently ending up signed out after launch.
- Scheduling link rows polished. Copy button shows a "Copied" confirmation, title and duration text centered, hover-brighten effect on row and mini-calendar icons.
- Fixed a bug where clicks could pass through overlay panels to the content underneath.
- Compose change-tracking consolidated onto a single internal driver, closing a class of stale-refresh bugs.
Scheduling Link Editor and Calendar Sidebar Polish
- Create and edit scheduling links right in the app. Set duration, buffers, timezone, conferencing, and a custom availability grid for each link.
- Your scheduling links list now updates instantly after you create, delete, or sync a link.
- Fixed a crash that could happen when opening the scheduling link editor.
- Fixed an error creating a scheduling link when its name matched one you already had.
- The calendar sidebar's Agenda view keeps the current day's header visible while you scroll.
- Calendars and Scheduling Links lists now scroll in their own space instead of pushing the rest of the sidebar around.
- Renamed sidebar tabs for clarity: "Events" is now "Agenda" and "Info" is now "Contact."
- Bigger, easier-to-use navigation arrows and Today button on the mini calendar.
Feature Complete: Calendar, Compose, and Settings Integrated
- Calendar fully merged. Read and write events, manage recurring meetings, RSVP from email. Desktop parity complete.
- Compose feature parity shipped. Inline replies, attachments, text formatting, snippets, hyperlinks, send-later scheduling.
- Settings parity complete. All 8 tabs functional: General, Privacy, Accounts, Shortcuts, Signatures, Vectors, Appearance, About.
- Classification tuned for production. k-NN parameters frozen for pitch detection accuracy after full corpus evaluation.
- Tier-1 marketing tightened. Expanded vocabulary and sender analysis reduces false positives in Marketing lane.
- Major version bump: all major features now integrated and working together. v1.3 marks feature completeness.
Text Measurement and Font Consistency
- Honest text measurement throughout. Labels now measure accurately including font spacing and kerning.
- Text measurement via C++. All measurements computed consistently through one system.
- Font roles unified. Contact info, buttons, labels all use theme-defined fonts instead of hardcoded.
- Search overlay styled. Chrome and copy routed through C++ color roles.
- Calendar labels measured correctly. Event times and period labels no longer overlap or clip.
- Contact panes consistent. All contact information fonts resolved from theme.
- Action bar polished. Button spacing and sizing matches original design.
Baseline Classification Model Updated
- Baseline corpus rebuilt with hand-curated examples. 200 pitch email samples ensure out-of-box accuracy.
- Marketing and pitch detection focused. Model trained specifically on these two categories for best real-world performance.
- Better day-one classification. Fresh installs get improved categorization from the start.
Move-to-Vector Scope and Agent Integration
- Move emails between categories with scope options. Move just this sender, or all similar emails, or just this thread.
- Agent tool integration. AI can now move emails to categories when you ask.
- Shared vote on sender scope. When moving by sender, all connected devices learn the same rule.
- Toast batching optimized. Multiple corrections batched into single notification.
- Learned rules reconciliation. Configuration saved safely without overwriting concurrent changes.
- Duplicate rules prevented. Sender and domain rules deduplicated automatically.
- Account switch safety. Learned rules remembered correctly when switching between accounts.
Learned Rules Settings and Toast Undo
- Learned Rules settings tab. Manage all your custom classification rules in one place.
- Rule deletion with keyboard. Delete learned rules using Delete key or click.
- Toast Undo available. Press Z to undo while a notification is showing.
- Undo renders in status bar. Visual indication that you can undo the last action.
- Classification moves via FFI. Move emails between categories through system calls.
- Bulk category operations. Move multiple emails at once to a new category.
- Scoped moves. Move only specific email selections without affecting rest of inbox.
Classification Tier-1 Refactor and Pattern Learning
- Classification predicates unified. Rule-based classification consolidated into single system for clarity.
- Warm domain as deciding rule. Emails from known contacts prioritized even if content looks like marketing.
- Pattern overrides learned. User corrections teach the app to override automatic decisions.
- Relationship scoring enhanced. Behavioral signals (quick replies, starred, marked important) now improve contact ranking.
- Decision trace recorded. System logs why each email was categorized for debugging and improvement.
- Relationship aggregator runs in background. Scoring computed during idle time instead of blocking user actions.
- Database migration 28. Schema updated with new classification fields and decision tracking.
Live Learning and Corpus Seeding
- Live corpus seeding. App learns from emails as you read them, improving classification in real time.
- Exemplar source tracked. System remembers whether a classification came from AI, user feedback, or baseline.
- Background seeding sweep. Classification model improves in background without blocking user actions.
- Corpus capacity managed. Keeps training data bounded at 500 examples per category.
- Classification progress shown. Launch overlay displays progress while initial AI analysis runs.
- Sender deduplication. Similar emails from the same sender use single example instead of duplicates.
- Embedding text budgeted. Text for AI analysis capped at 1024 characters to manage performance.
Semantic Corpus and Embedding Improvements
- Tier-2 baseline corpus shipped. Out-of-box semantic classification knowledge included in app download.
- Embedding text normalization. Text prepared consistently before AI analysis for better accuracy.
- Duplicate exemplar suppression. Similar training examples deduplicated to improve classification speed.
- Cached embeddings invalidated properly. When text processing changes, cached results refreshed automatically.
- HTML entity decoding via Engine. Consistent entity handling across email parsing.
- Corpus diagnostic tools. Built-in tools for analyzing and debugging classification data.
- Secondary branch merged. Major features from secondary-fresh branch integrated to main.
Receipt and Transaction Detection Improvements
- Better receipt detection. Emails that are text-only or use images for receipts now recognized correctly.
- Currency detection added. Euro and pound amounts recognized alongside dollar signs for receipt verification.
- Shipping and travel vocabulary expanded. More keywords and variations recognized for accurate categorization.
- Refund detection. Classified transactions no longer include refund emails in the Transactions category.
- Delivery failure handling. Bounce messages from mail servers routed to Priority inbox.
- Nextdoor recognition. Community notifications classified as Social correctly.
Inbox Zero Celebration and Social Platforms
- Inbox zero celebration merged. Reaching empty inbox now triggers a fun celebration screen.
- Social platform detection expanded. Recognizes dating, social media, and event platforms worldwide.
- Localized social notifications. Platform notifications translated for international users.
- Marketing classification refined. Real emails no longer misclassified as marketing if they contain event or policy information.
- Social tabs visible by default. Social category tabs now show unless explicitly hidden.
- Calendar pane grows. Agenda section expands to fill available space on wider screens.
- Calendar container colors themed. Calendar widget respects the app color scheme.
Security Hardening and Status Bar Polish
- URL validation for safety. Contact photos and meeting links validated to prevent phishing.
- CSS injection blocked. Email styles sanitized to prevent overlay attacks via CSS.
- Cross-account data protection. Scheduling and snippets scoped to prevent accidental data leak between accounts.
- Sync indicator flicker fixed. Progress indicator no longer flashes unnecessarily.
- Status bar reactive. Left and right zones now react to sync and account state changes.
- Newsletter classification tightened. Bulk mail and newsletters more accurately categorized.
- Travel keywords gated. Calendar event classification uses travel provenance for accuracy.
Compose Attachments and Text Formatting
- Attachments in compose. Add and remove files before sending. File list shows sizes and names.
- Snippet autocomplete. Type a snippet shortcut and the full template auto-fills.
- Hyperlink editor. Click to add or edit links in your message. URL normalization built-in.
- Text color palette. Select from predefined text colors that match the app theme.
- Formatting toolbar. Bold, italic, underline, and lists appear as an easy-access panel.
- SendLater integration. Scheduled sends include attachments correctly when they fire.
- Classification offline. Email categorization works even without network access.
Inline Compose and New Message Card
- Reply inline in thread. Compose reply and forward messages directly at the bottom of the thread view.
- New message as overlay card. Composing a new email now appears as a centered card instead of opening a separate window.
- Compose layout tokens. Buttons, text, spacing, and colors all from theme system for consistency.
- Attachment sizes formatted. File sizes display as readable labels (e.g., "2.5 MB") instead of raw bytes.
- Plain text email fallback. Emails that are only plain text render correctly without HTML rendering.
- Thread header collapse fixed. Thread headers now properly collapse and expand when opening messages.
- Icon sizing consistent. Text and icons properly spaced in headers and buttons.
Classification Learning and Calendar Features Merged
- Out-of-box classification knowledge. App ships with baseline email categories pre-trained so classification works immediately on first use.
- User feedback improves classification. Your manual category choices teach the AI to improve its own predictions.
- Crowdsourced learning loop. Anonymous feedback helps the baseline model improve for everyone.
- Calendar CRUD features merged. Full calendar read/write support now in main build.
- Settings parity complete. All settings tabs now feature-complete and merged.
- Layout migrations to C++. More UI layout now computed by the core engine for consistency.
- Schema update. Database upgraded to support thread summaries.
Calendar Event Viewing and RSVP
- Event details now readable. Click a calendar event to see full details (time, description, attendees, meeting link).
- RSVP from email. Accept or decline event invitations directly without leaving the app.
- Conference links clickable. Google Meet and Zoom links in events open in your browser.
- Double-click to edit. Calendar events can be edited by double-clicking on the grid.
- Event layout styled. Event editor matches the app theme with proper buttons and text fields.
- Copy to clipboard. Event details can be copied for pasting elsewhere.
- Icon sizes fixed. Glyphs in buttons and fields no longer clip or cut off.
On-Device AI Classification Live
- Semantic classifier powered by on-device model. Emails analyzed locally without sending to cloud. Faster, private, always works offline.
- Email stale-flash fixed. Thread view no longer briefly shows old content when switching emails.
- Startup faster. Summary system now optional, reducing initial load time on first launch.
- Classification learns from corrections. When you manually recategorize an email, the AI improves for similar emails.
- Tier-2 runs independently. Classification and AI components no longer block each other during startup.
- Embedding model integrated. Semantic understanding of email content built in.
- Visual polish. Covers UI elements during thread transitions for smoother appearance.
AI Summaries and Email Normalization
- Email summaries now generated locally. AI reads emails and writes concise summaries. No data sent to cloud.
- Summarization by token budget. Longer emails get multi-bullet summaries, short emails get one line. Respects model limits.
- Boilerplate stripped automatically. Common phrases ("Best regards", "Thank you", etc.) removed from 1600+ language variations. Cleaner summaries.
- Email rendering flash fixed. Thread view no longer shows old email briefly when switching.
- Chip width measured accurately. Email badges no longer cut off text.
- MIME parsing improved. Nested email attachments handled correctly.
- Vector storage system added. Foundation for AI-powered email organization.
AI Summary Panel and Contact Card
- AI summary shown in thread view. Automatic summary of email content appears as a panel next to the message.
- Unread emails summarized on open. App automatically generates summaries for unread emails and Important messages.
- Contact card follows focused message. Sender info appears for the message you're currently reading.
- Summary panel layout and rendering moved to C++. Consistent with theme, no Swift layout logic.
- Recent conversations query fixed. Contact history only shows from current account, not mixed across accounts.
- Contact card deduplication. Opening a thread no longer re-fetches contact info unnecessarily.
- Colors and fonts routed through theme. All text styling now uses theme system, no hardcoded values.
Inline Images and Launch Readiness
- Inline images now display in emails. Photos embedded in message bodies render properly instead of showing as broken attachments.
- Loading overlay timing fixed. Shows while app initializes, dismisses when ready instead of lingering or disappearing too early.
- Readiness gate for thread list. Inbox waits until classification is complete before showing, preventing stale data display.
- WebView factory consolidated. All email rendering uses same setup, ensuring consistent image handling and fonts.
- Remote image handling improved. Engine update fixes TLS validation for email images.
- Badge width measured correctly. Vector tab badges no longer overlap with category name.
- Launch theme properly detected. Logo variant matches dark/light mode on startup.
Folder Sidebar and Overlay Animations
- Folder sidebar now keyboard navigable. Use arrow keys to browse folders instead of clicking.
- Overlay animations polished. Slide and fade transitions feel snappy. Animations on all modal panels.
- Thread list consistency fixed. Archive and trash operations now work smoothly even during rapid clicks.
- Thread list centralized. Single source of truth for what threads to show prevents stale data.
- Folder sidebar layout in C++. Layout engine handles spacing, separators, and header formatting.
- Thread enter/leave animations. Emails fade in and lift away smoothly when added/removed from view.
- Vector counts accurate. Tab badges now show correct unread count for each category.
Sync Engine Architecture Refactor
- Sync system rebuilt cleaner. Old sync framework replaced with modern reducer-based architecture. More testable, fewer bugs.
- Label picker height computed correctly. Panel size now calculated by core instead of Swift guessing.
- Search display mode decided in C++. How results display is consistent everywhere.
- Calendar events sync improved. Events now sync through same reliable system as email.
- Thread deletion verified. Structural tests ensure sync never deletes threads incorrectly even during edge cases.
- Thread inbox state preserved. Archive and restore operations now keep thread content intact.
- Vector color range checked. Tab colors now validated to stay within palette.
Thread List Performance and Window Layout
- Thread list now loads rows on-demand. Only visible emails fetched and rendered, not the entire inbox. Much faster scrolling.
- Thread rows animated on entrance. Emails fade in smoothly as they're added to the list.
- Command palette layout in C++. Scrolling and hover behavior now controlled by core, consistent everywhere.
- Thread view redesigned as cards. Messages display with proper spacing and theming.
- Window shell layout in C++. Main window split (sidebar, content, widget pane, status bar) computed once.
- Window animations from C++. Smooth transitions when resizing or switching panels.
- Delete confirmation added. Threads only removed after server confirms deletion, preventing accidental loss.
Classification Performance and Tab Navigation
- Classification skips unchanged threads. Only newly arrived emails get classified each sync cycle, reducing CPU usage during background syncs.
- Tab cycling with Tab/Shift+Tab. Navigate email categories using keyboard with wrap-around at edges.
- Inbox visibility requires classification. App waits until classifier is ready before showing inbox to ensure emails are properly sorted.
- Widget pane animates on width change. Smooth resize when switching between tools.
- Thread list navigation fixed. Cursor stays on valid threads when switching categories.
- Fewer duplicate updates. Presenters no longer emit the same state multiple times, reducing UI redraws.
- Tab clicks work reliably. Clicking between categories no longer gets stuck.
Typography and Layout Consistency
- Font sizes now scale smoothly — text adjustment works without breaking layouts or cutting off words.
- Dark and light modes look different — each theme can adjust font weights for better readability in its mode.
- UI elements align consistently — thread rows, status bar, tabs, and activity view all use the same spacing rules.
- Calendar tab underline fixed — appears correctly and animates smoothly on theme changes.
- Subject lines no longer cut off — text measurement accounts for font spacing.
- Tab animations smooth — switching between tabs and themes now feels polished.
Shared Code Foundation for Cross-Platform
- Picker logic moved to shared core — label and move pickers now work the same way everywhere. Prepares for Windows and Linux versions.
- Thread details logic unified — how sender info, enrichment, and activity display is handled. Same logic on all platforms.
- Settings behavior standardized — keyboard handling and input routing now shared. Consistent UX across platforms.
- Overlay system centralized — modal and animation logic now in shared code. Enables future platform support.
- Keyboard hints managed centrally — hint display logic no longer split between Mac and core code. Single source of truth.
Core Logic Moved to Shared Code
- Thread display rules unified — which badges show, which icons display. Same logic across all platforms.
- Settings panels moved to core — Shortcuts, Signatures, and other settings now work the same everywhere.
- Category defaults centralized — default names for email categories ("Personal", "Work") no longer duplicated in Mac code.
- Icon cycling logic moved — shared logic for iterating through icon choices.
- Undo messaging unified — consistent undo confirmations and messages across the app.
- Thread list decisions centralized — what shows in each row is decided once, not per-platform.
Thread Safety Improvements
- Sync engine stabilized — thread safety improved to prevent rare race conditions during email sync.
- Classification system hardened — fixed potential data corruption in the classifier during concurrent operations.
- Calendar sync safer — eliminated race conditions in background calendar updates.
- Contact enrichment protected — sender photo/company/title fetch now thread-safe even with rapid account switches.
- Action queue simplified — email action dispatch now uses cleaner threading model. Fewer moving parts, fewer bugs.
- Email preloading robust — background preload of next email no longer conflicts with active message viewing.
- Deferred actions secure — send-later and scheduled actions protected from race conditions.
Command Palette Rebuilt in C++
- Command Palette moved to C++ — rebuilt from scratch using C++ presenter instead of Swift. Faster, more responsive, fully testable in unit tests without UI automation.
- CommandPalettePresenterFFI — new FFI layer owns the palette overlay and manages its state. Swift view just renders what C++ tells it to show. Clean separation of concerns.
- Navigation mode synced — C++ navigation mode is mirrored into NavigationBridge reactively. Palette responds instantly to navigation state changes (which folder you're in, which thread is selected, etc.).
- InputSystemV2 controls Cmd+K — keyboard shortcut routed through new InputSystemV2 nav context. When you hit Cmd+K, it goes through a single, testable C++ path.
- Action dispatch — when you pick an action from the palette, it's dismissed first, then the action is dispatched. Prevents weird state where palette is still visible during action execution.
- Legacy cleanup — renamed old Swift Sources/ directory to Legacy/ to signal that it's no longer the primary code path.
- V1 InputSystem realigned — old V1 tests updated now that Cmd+K moved to V2. Keeps test suite in sync with new architecture.
Settings UI Controls & Typography
- General tab controls — control bounds (min/max) driven from C++ state. Serialized across FFI.
- Typography scaling — font sizes clamped to core-owned range. Proportional scaling via UserTypographyPrefs.
- Page scroll — percent values published from core. FFI contract clarified.
- Appearance mode validation — asserts on invalid mode in GeneralSettingsView render.
Thread List Mouse Input & FFI
- ThreadListFFI mouse support — mouse input routed through C++ presenter. Click to select threads.
- Thread selection — driven from C++ cursor via ThreadListFFI observable.
- Keyboard consumed signal — threaded through FFI and Mac bridges. Prevents duplicate handling.
- InputSystem coverage — hardened test coverage for Slice 4 input handling.
Keyboard Bindings & Persistence
- KeyBindingsSystem — loads and applies persisted rebinds on startup. Custom shortcuts restored on app launch.
- Shortcuts tab FFI — resolved from live KeyBindingsSystem. Mutators degrade to no-op on nil handle.
- CustomKeyBindings persistence — overrides stored through Store. Synced across sessions.
- Keyboard and navigation FFI — resolved from AppState handle. Unified keyboard handling.
Swift Test Migration & FFI Consolidation
- Test base migration — all Swift tests migrated onto single appstate_create FFI symbol. Simplified bootstrap.
- WidgetPaneViewTests — now run under Full appstate profile. More realistic test environment.
- Composition shutdown — handle removal asserted directly in FFI test. Cleaner cleanup verification.
- HyperdriveCore docs — updated to document 3-arg appstate_create signature.
- Full-appstate shims — removed forwarding test shims. Direct composition-based setup only.
Sync Refactoring & Test Fixes
- Sync pipeline refactored — ingestThreadResponseInTransaction grouped parameters into context struct. Cleaner API.
- Message persistence — backfill now persists Message rows alongside Thread rows.
- Type consistency — fixed internalDate types across sync, preload, and test fixtures. All timestamps now consistent.
- Async test fixes — MutedThreads test now properly waits for async enqueue dispatch.
- Code cleanup — removed unused ThreadLabelSync include from BackfillCoordinator.
Stack-Based Navigation & UI Polish
- Stack-based thread navigation — replaced split-view with navigation stack. Cleaner state management, easier testing.
- System appearance mode — respects system light/dark preference. Auto-switches with system theme.
- Search keyboard polish — j/k keys navigate results. Two-stage Esc (dismiss, then clear). Recent searches keyboard accessible.
- Contact tab — new WidgetPane tab showing contact info. Bridged from C++ presenter.
- Undo banner — shows undo actions with keyboard shortcut hints.
- Picker panels merged — date picker, move picker, and label picker PRs merged and integrated.
Search UI & Modal Pickers
- SearchPresenter — full search implementation with query, history, and account filtering. Real-time search results.
- SearchFFI — C++ search bridge. Observe/search/clear operations with server-side FTS.
- Mac search UI — SearchViewController with keyboard navigation and result display in thread list.
- SnoozePresenter — snooze date picker with presets and custom dates. Generates unique snoozeId. Dispatches to ActionQueue.
- MovePickerPresenter — select folder/label to move thread. System folders first, then user labels. Keyboard filterable.
- LabelPickerPresenter — toggle labels on threads. Filter by name. Keyboard navigation through label list.
- ContactCardPresenter — displays contact info in thread header.
- DatePickerPresenter — shared date picker for snooze, reminder, and compose date inputs.
Settings Tabs: Shortcuts, Signatures, Vectors
- ShortcutsTabPresenter — view and customize keyboard bindings. Every action shows its current shortcut. Rebind via key capture.
- SignaturesTabPresenter — manage email signatures. Create, edit, delete. Set default signature per account.
- VectorsSettingsPresenter — configure custom vectors for email classification. Create labels, set colors, manage rules.
- Non-rebindable actions — some actions (undo, redo, focus) have fixed shortcuts. Shown but not editable.
- Keyboard shortcuts as ActionID — all shortcuts resolve to registry entries. Unified command/shortcut system.
Settings Tabs & Theme Persistence
- SettingsPresenter — coordinator for 8-tab settings panel. Manages tab selection and presenter lifecycle.
- GeneralTabPresenter — app preferences (language, startup behavior, notifications).
- PrivacyTabPresenter — privacy controls (block remote images, tracking opt-out). Per-account settings.
- AccountsTabPresenter — manage connected accounts. Add, remove, set default account.
- Theme persistence — theme selection saved to Store. Restored on app launch.
- PreferencesStore — migration from hand-rolled SQL to Engine primitives. Full CRUD with type safety.
Preferences System & Input Refactor
- PreferencesSystem — app-wide preference storage with atomic setters. Observables for preference changes. Full roundtrip testing.
- InputSystem migration — moved to Engine keyboard primitives. Deleted legacy hand-rolled types. Cleaner keyboard handling.
- Pipeline batch emissions — ScopedBatch for efficient observable emissions. Stop() batches multiple updates into single notification.
- LLM lazy loading — deferred model loading via coroutines. Models loaded on demand, not at startup.
- Stale discard specificity — pipeline proves which stale updates are safe to discard. Integration tests verify versioning.
Compose with ProseMirror Editor (Wave 1)
- ComposePresenter — full compose state management. Recipients, subject, body, attachments, send scheduling. 28 tests.
- ProseMirror editor — rich text editor bundled and integrated. 10 tests covering basic operations.
- Mac compose window — full compose UI with editor WebView. FFI wiring to C++ backend.
- Draft persistence — auto-save drafts every 5s. Persist to DraftManager. Recover on app restart.
- Reply/forward — hydrate composer from original thread. Quote original message. Set recipients from headers.
- Send options — send now or schedule for later. Add snippets and signatures. Attach files.
- Snippet resolution — substitute variables in snippets (name, date, etc). 10 tests.
- ComposeSendService — dispatch send and schedule actions. Integrate with ActionQueue.
Audit & Engine Duplication Cleanup
- Engine duplication audit — 87 files scanned, 52 findings of hand-rolled primitives that should use Engine. Resolved 8 violations.
- StringUtils migration — replace trim, toLower, equalsIgnoreCase with Engine primitives. 52 findings fixed.
- Hardcoded colors/fonts guard — CI checks prevent NSColor/NSFont in code. Enforces theme-driven styling.
- Zoom integration — full C++ migration (config, client, system, FFI). Zoom scheduling in compose.
- Slack integration — fixed per-account filtering, connectivity wiring, batch queries. Test coverage improved.
- LLM classification — shared classifier across accounts. LLM cache for speed. AI proxy auth via credential store.
Calendar Write Ops & Snippets
- Calendar write operations — create, update, delete events. ETag support for conflict detection. Google Meet link support.
- Recurrence rules — RRULE string parsing and generation. Bidirectional conversion. Recurring event support.
- Scheduling links — full C++ migration for meeting links. Zoom and Google Meet integration.
- Snippets system — variable resolution for email templates. Store snippets in database. Sync across devices.
- Snippet model — per-account storage. Full-text search. Variable replacement on send.
- Gmail filters — full API wrapping. Create filters with criteria and actions. Atomically block senders.
Email Signatures & Composition Refactor
- SignatureStore — CRUD operations for email signatures. Synced across devices via server API.
- SignatureSyncService — push/pull signatures. Conflict resolution. HTML sanitization on import.
- SignatureFFI — load, save, delete, push, pull over C ABI. Full test coverage.
- AppComposition — centralized dependency graph. All systems created/wired in one place. Clear lifetime contracts.
- HyperdriveApp refactor — delegates composition to AppComposition. Simpler bootstrap logic. Easier testing.
- ComposePipeline — accepts signatures via ComposeConfig. Injects into composer. Variable substitution.
Contact Management & Search
- ContactsSystem — full sync of Google Contacts. Incremental sync for updates. Search across all contacts.
- PeopleContactsClient — Google People API wrapper. Sync pagination. Photo/company/title extraction.
- ContactSearchMerger — scored contact search. Combines Gmail recipients and Google Contacts. Frequency-based ranking.
- ContactsFFI — search, create, syncNow operations. Contact list observable. Server-fired updates.
- ContactsPipeline — full lifecycle. Bootstrap, sync, search. Integration tests verify parity.
LLM Classification & Vector Config
- VectorConfigSystem — per-account vector configuration persistence. Custom vector management in C++.
- SenderLlmClassifier — LLM-based classification of senders. On-device inference for pitch/cold detection.
- LlmClassificationParser — parse AI proxy responses. Map to sender classification categories.
- SharedClassificationClient — cross-account shared classification lookup. Reduces redundant computation.
- License key integration — store license in ICredentialStore. Enable AI proxy auth.
- RestClient HeaderProvider — unified header auth across all clients (Classification, Deferred, etc).
Hyperdrive v1.1 Released to Main
- Complete NovaEngine rewrite shipped — moved from legacy Swift AppKit to cross-platform C++ foundation. Same feature set, modern architecture, ready for Windows/Linux.
- 40 days of development — 812 commits. From bare scaffold (April 10) to production-ready release (May 20).
- Full email client feature parity — read, compose, search, filter, archive, label, snooze, remind, schedule sends, track opens/clicks, classify messages.
- Multi-account support — connect multiple Gmail accounts. Combined inbox view, per-account preferences, independent sync.
- Offline-first architecture — all mutations queued durably. Syncs when reconnected. No data loss on crashes.
- Keyboard-first design — 146 actions accessible via keyboard. Cmd+K command palette. Every feature reachable without mouse.
- Performance optimized — sub-50ms response for user actions. WebView pooling with N+1 preload. 60fps thread list scrolling.
- Extensible design — AI Agent tool integration. Vector classification system for custom email triage. Server-driven deferred sync for cross-device features.
- Production quality — comprehensive error handling, extensive test coverage, graceful degradation on network failures.
Settings UI Controls & Typography
- General tab controls — control bounds (min/max) driven from C++ state. Serialized across FFI as JSON ranges.
- Typography scaling — font sizes clamped to core-owned range. Proportional scaling via UserTypographyPrefs.
- Page scroll — percent values published from core. FFI contract clarified in docs.
- Appearance mode validation — asserts on invalid mode in GeneralSettingsView render.
Thread List Mouse Input & FFI
- ThreadListFFI mouse support — mouse input routed through C++ presenter. Click to select threads.
- Thread selection — driven from C++ cursor via ThreadListFFI observable.
- Keyboard consumed signal — threaded through FFI and Mac bridges. Prevents duplicate handling.
- InputSystem coverage — hardened test coverage for Slice 4 input handling.
Keyboard Bindings & Persistence
- KeyBindingsSystem — loads and applies persisted rebinds on startup. Custom shortcuts restored on app launch.
- Shortcuts tab FFI — resolved from live KeyBindingsSystem. Mutators degrade to no-op on nil handle.
- CustomKeyBindings persistence — overrides stored through Store. Synced across sessions.
- Keyboard and navigation FFI — resolved from AppState handle. Unified keyboard handling.
Swift Test Migration & FFI Consolidation
- Test base migration — all Swift tests migrated onto single appstate_create FFI symbol. Simplified bootstrap.
- WidgetPaneViewTests — now run under Full appstate profile. More realistic test environment.
- Composition shutdown — handle removal asserted directly in FFI test. Cleaner cleanup verification.
- HyperdriveCore docs — updated to document 3-arg appstate_create signature.
- Full-appstate shims — removed forwarding test shims. Direct composition-based setup only.
Sync Refactoring & Test Fixes
- Sync pipeline refactored — ingestThreadResponseInTransaction grouped parameters into context struct. Cleaner API.
- Message persistence — backfill now persists Message rows alongside Thread rows.
- Type consistency — fixed internalDate types across sync, preload, and test fixtures. All timestamps now consistent.
- Async test fixes — MutedThreads test now properly waits for async enqueue dispatch.
- Code cleanup — removed unused ThreadLabelSync include from BackfillCoordinator.
Stack-Based Navigation & UI Polish
- Stack-based thread navigation — replaced split-view with navigation stack. Cleaner state management, easier testing.
- System appearance mode — respects system light/dark preference. Auto-switches with system theme.
- Search keyboard polish — j/k keys navigate results. Two-stage Esc (dismiss, then clear). Recent searches keyboard accessible.
- Contact tab — new WidgetPane tab showing contact info. Bridged from C++ presenter.
- Undo banner — shows undo actions with keyboard shortcut hints.
- Picker panels merged — date picker, move picker, and label picker PRs merged and integrated.
Smart Vector Classifier & Cold Pitch Detection
- VectorClassifier complete — classifies threads into user-defined vectors (categories) using ML and heuristics. Core email triaging engine.
- Cold pitch detection — 3-gate system identifies unsolicited pitches and sales messages. Strips PII and matches against pitch corpus.
- Smart signals — team detection, relationship analysis, backlog tracking, social/travel signals, shipping detection. 8 total signal types.
- SmartVectorQueryBuilder — builds SQL queries for vector filtering. Handles label inclusion, FTS, date ranges, mixed eligibility.
- LLM cache — caches classification decisions for speed. Shared intelligence across accounts.
- ML prediction — integrates with on-device ML for semantic analysis alongside heuristics.
- Findambiguous threads — identifies borderline classifications for review.
DateParser C++ Port
- DateParser ported to C++ — 110 tests verify exact parity with Swift version. Handles natural language dates like "next Friday", "in 3 days", "end of month".
- Cross-platform compatible — works on macOS and future platforms. End-of-week boundary fixes and time handling standardized.
- FFI bridge — C++ DateParser exposed to Swift for snooze/reminder date picking.
Email Preloader & Sender Enrichment
- PreloaderSystem — N+1 preloading of email bodies. While reading thread N, thread N+1 is pre-rendered in the background for instant display.
- Enrichment LRU cache — fetched contact data (photo, company, title) cached with TTL. Reduces API calls on repeated opens.
- SenderEnrichmentView — displays enriched sender info in thread header (photo, company, title, relationship).
- Tracking activity list — merged view of open and click events for the current thread. Shows who opened and when.
- Account-switch resilience — preloading handles account switches gracefully without data corruption.
Email Open & Click Tracking
- TrackingSystem — tracks when recipients open emails and click links. Optional opt-in feature. Requires mail server integration.
- Pixel tracking — embeds invisible tracking pixels in emails. Records opens per recipient.
- Link tracking — rewrites mailto links to route through tracking server. Records clicks per link.
- Per-account polling — each account polls independently for open/click events. Coalesces rapid updates to avoid API hammering.
- TrackingClient — queries server API for opens and clicks. Handles pagination and error recovery.
- Contact enrichment — fetches enriched contact data (photo, company, title) from server.
Email Rendering Pipeline Refactor
- EmailRendererController — centralized controller for WebView rendering. Handles prewarm, next/previous message navigation, status tracking.
- Engine integration — migrated to Engine::FFI::Internal::PointerRegistry for handle management. Engine::ObjectPool for WebView pooling. Engine string utilities for sanitization.
- Atomic updates — threadId and html bundled atomically. Prevents rendering stale data on race conditions.
- Utf8 validation — uses Engine::Encoding::Utf8::isValid for proper validation. Catches malformed emails before rendering.
- Error logging — render failures logged clearly with threadId for debugging.
- Color transform — dark mode adaptive coloring for email backgrounds. Preserves contrast and readability.
Thread Display Fields & HTML Entities
- Thread display fields — each thread has color, badge, icon, and divider for visual organization. Computed from vector classification.
- HTML entity decoder — safely decodes HTML entities in thread snippets (&, <, >, named entities like , {). No HTML injection.
- Snippet normalization — whitespace normalized in thread list rows. Smart truncation preserves readability.
- Badge rendering — displays sender classification badge (promotions, social, etc). Color-coded per vector.
- ProviderDisplayResolver — maps provider-specific data (Slack channels, Gmail labels) to display fields.
- SlackProviderMeta — metadata for Slack thread rendering. Channel, parent thread ID, and thread-specific attributes.
Email Unsubscribe Service
- UnsubscribeService — one-click unsubscribe from mailing lists. RFC 8058 (one-click POST) and RFC 2369 (List-Unsubscribe headers).
- Unsubscribe detection — scans email headers and body for unsubscribe links. Tries multiple methods in priority order.
- Block sender — alternative to unsubscribe. Creates Gmail filter to block all emails from sender.
- Gmail filter integration — createFilter wraps Gmail settings API. Atomically blocks sender's emails.
- Fallback chain — tries POST, mailto, then creates filter if both fail. Graceful degradation.
- Header parsing — RFC 2369 List-Unsubscribe headers extracted and prioritized.
Read-Only Calendar Integration
- CalendarSystem — reads Google Calendar events for the active account. Displays calendar in sidebar/widget.
- CalendarClient — Google Calendar v3 API wrapper. Fetches events with pagination and filtering. Read-only (no create/edit).
- Calendar events indexed — CalendarEvent model with full-text search. Indexed by date range for fast queries.
- Visibility toggle — users can hide/show specific calendars. Preference persisted per account.
- Sync coalescing — rapid changes coalesced into single sync. Prevents API hammering on multiple calendar changes.
- Multi-account support — each account has independent calendar sync and visibility preferences.
Combined Inbox View
- Combined inbox — unified view of all threads across all connected accounts. Single thread list shows emails from every account.
- Account deduplication — same thread ID in multiple accounts shown once. Clicking opens the primary account's copy.
- Folder aggregation — system labels (INBOX, SENT, DRAFT, TRASH) aggregated. User-created labels kept per-account.
- Cross-account unread count — unread badge shows total across all accounts.
- Toggle on/off — combined mode can be disabled to see single-account view. Preference persisted.
- Composite indexing — database indexes optimized for cross-account queries. Fast aggregation even with thousands of threads.
Backfill & Sent Mail Scanner
- BackfillCoordinator — fetches old emails beyond initial inbox sync. Runs in background without blocking other syncs.
- Staleness check — avoids backfill if inbox already synced recently. Prevents unnecessary API calls.
- Page token persistence — backfill resumes from last position if interrupted. No duplicate fetching.
- SentMailScanner — extracts recipients from sent emails. Builds relationship data for contact autocomplete and prioritization.
- Recipient extraction — parses To/CC/BCC headers and finds unique email addresses. Normalizes and deduplicates.
- Relationship upsert — stores relationships atomically. Multiple messages to same recipient increments count.
Offline Detection & Connectivity
- ConnectivitySystem — monitors network status via NWPathMonitor. Detects online/offline transitions in real time.
- Sync pause on offline — sync polling pauses when network is unavailable. Reduces battery and data usage.
- Automatic resume — when connectivity returns, sync resumes immediately with ActionQueue replay.
- Backoff reset — network reconnection resets exponential backoff. Failed requests retry immediately on reconnect.
- Offline gate — ActionQueue operations queued offline. On reconnect, all pending actions flushed to Gmail.
- Status observable — connectivity state published as observable. UI shows offline indicator when disconnected.
Thread Vector Classification
- ClassificationSystem — categorizes threads into user-defined vectors (Personal, Work, Promotions, etc). Powers email triage.
- Thread overrides — users can manually override auto-classification. Preference respected in UI.
- SenderClassification — tracks sender-specific routing rules. "Always label this sender's emails as Work".
- SenderRelationship — stores relationship level (close friend, coworker, cold). Used for prioritization and filtering.
- Relationship computation — algorithmic scoring based on frequency, recency, and domain (company email vs personal).
- Conflict resolution — handles duplicate/conflicting classifications atomically.
- Sync engine — ClassificationSystem syncs server-computed categories and stores user overrides.
Snooze, Reminders & Draft Management
- SnoozeQueue — defer emails to appear later. Snoozed threads removed from inbox, scheduled to return at specified time.
- ReminderQueue — set reminders on emails independently. Works on already-read emails. Notification at scheduled time.
- DraftManager — local draft storage with throttled Gmail sync. Start composing, changes auto-save locally. Synced to Gmail every 30s.
- Draft recovery — if app crashes, drafts are recovered on restart. No lost work.
- Per-account drafts — each account has independent draft storage. Switching accounts shows that account's drafts.
- Server-fired reminders — reminders can be set on the server. Cross-device sync ensures reminders fire on all devices.
Deferred Sync & Offline-First Actions
- DeferredSyncSystem — server-driven sync for data that can't be pulled (snoozes, reminders, sent status). Server notifies app when state changes.
- DeferredAuthManager — secure token storage for server communication. Device fingerprint-based encryption.
- SendLater — schedule emails to send at specific time. Server holds draft until send time, then delivers.
- Cross-device sync — snoozes, reminders, and send-later work across devices. Set on phone, see in client.
- Crypto vectors — V2 encrypted transport with cross-language crypto test vectors. Ensures compatibility across platforms.
- Dedicated client — separate HttpClient for deferred API. Independent retry logic and timeouts.
Hyperdrive v1.1 Released to Main
- Complete NovaEngine rewrite shipped — moved from legacy Swift AppKit to cross-platform C++ foundation. Same feature set, modern architecture, ready for Windows/Linux.
- 40 days of development — 812 commits. From bare scaffold (April 10) to production-ready release (May 20).
- Full email client feature parity — read, compose, search, filter, archive, label, snooze, remind, schedule sends, track opens/clicks, classify messages.
- Multi-account support — connect multiple Gmail accounts. Combined inbox view, per-account preferences, independent sync.
- Offline-first architecture — all mutations queued durably. Syncs when reconnected. No data loss on crashes.
- Keyboard-first design — 146 actions accessible via keyboard. Cmd+K command palette. Every feature reachable without mouse.
- Performance optimized — sub-50ms response for user actions. WebView pooling with N+1 preload. 60fps thread list scrolling.
- Extensible design — AI Agent tool integration. Vector classification system for custom email triage. Server-driven deferred sync for cross-device features.
- Production quality — comprehensive error handling, extensive test coverage, graceful degradation on network failures.
Keychain & Navigation Improvements
- Keychain cleanup — command to delete stale OAuth tokens. Removes old nova.tokens entries from macOS Keychain.
- Navigation overlay — shows when navigating between accounts/folders. Prevents interaction during state transition.
- Thread participants — thread detail shows all participants in the conversation. Grouped by role (to, cc, bcc).
- Folder type flags — system labels tagged as system vs user-created. UI renders differently for better organization.
Command Palette & Keyboard Navigation
- Command Palette (Cmd+K) — universal search and execute interface. Type to find any action in the app: move, label, snooze, compose, etc. Filters in real-time with fuzzy search.
- ActionRegistry — 146 registered actions across all email operations. Includes both static actions (archive, delete) and dynamic ones (label-specific, account-specific).
- Keyboard navigation — arrow keys to move between threads, Enter to open, Cmd+J for AI Agent. Every action is keyboard-accessible.
- Agent tools — AI Agent has access to all 146 actions via ActionRegistry. Agent can automate any inbox operation.
- Status bar hints — shows keyboard shortcuts for common actions. Hints update based on context (folder, thread selection, etc.).
- Contact model extended — stores full Google People API fields (phone, address, organization, photo). Powers contact autocomplete in compose.
- Email header parsing — To/CC/BCC headers are parsed and stored. Enables recipient search and contact mining from conversations.
- Next/previous thread — Cmd+N and Cmd+P navigate threads in the current folder without touching the mouse.
WebView Pooling & Preload Optimization
- WebViewPool — reuses WebView instances instead of creating new ones for each email. Dramatically reduces memory usage and creation overhead.
- Checkout/checkin — threads borrow a WebView from the pool to render email bodies, then return it for the next thread to use.
- Pool pre-allocation — the pool starts with several pre-created WebViews ready to use. Reduces latency on first render.
- N+1 preloading — while you're reading email N, email N+1 is pre-rendering in a preload slot. Switching threads is instant.
- Preload claiming — when you select a thread, if its preload slot exists, ownership transfers atomically. No race conditions.
- Pool exhaustion — if all WebViews are in use, new ones are created on demand and added to the pool.
- FontSchemeHandler — custom scheme handler serves fonts (Hack monospace) to WebView. Fonts are embedded in the app binary.
- Graceful shutdown — all pooled WebViews are destroyed cleanly on app exit.
WebView Email Body Rendering
- EmailRenderer — renders email bodies in a WebView. Handles complex HTML, styled text, embedded images, and special formatting from different email clients.
- Sanitization pipeline — HTML is sanitized before rendering, removing scripts and dangerous content. CSP (Content Security Policy) is injected for additional protection.
- Theme support — email bodies automatically adapt to light/dark mode via CSS custom properties. Fonts match the app's typography.
- Rendered HTML cache — frequently viewed emails are cached after rendering to avoid re-sanitizing and re-rendering on every view.
- Body style extraction — original email styling (colors, fonts, spacing) is preserved while removing dangerous CSS.
- Document wrapping — proper HTML structure with viewport meta tags, UTF-8 encoding, and container divs for CSS scoping.
- UTF-8 validation — malformed or corrupted email bodies are detected and handled gracefully.
- Navigation events — clicks on links are tracked and can trigger custom actions (open in browser, add contact, etc.).
Email Rendering & HTML Sanitization
- HtmlSanitizer — strips malicious content from email HTML before displaying. Removes scripts, event handlers, iframes, and other dangerous elements.
- Security — blocks javascript: URIs in links, removes onclick/onload/etc attributes, strips form elements and inputs. Prevents clickjacking and script injection.
- Remote image blocking — tracking pixels and external images can be stripped based on settings. Protects privacy from email tracking.
- Quoted content detection — automatically recognizes quoted/replied text from Gmail, Outlook, and Apple Mail. Formats quoted sections clearly so you can see the conversation thread.
- ThreadRenderer — renders email bodies safely with proper formatting. Handles complex MIME structures and alternate content types.
- Allowlist enforcement — only safe HTML tags and attributes are preserved. Iframe, object, embed, form, input, and base tags are always stripped.
- Message count badge — thread rows show a badge when the thread has multiple messages, making it easy to spot conversations.
- Hover selection — hovering over a thread row highlights it and opens it for quick preview.
Thread List & Message Details
- ThreadListViewController — displays all threads from the selected folder. Updates automatically when you switch folders or when new emails arrive.
- Thread rows — show sender name, subject, snippet, and unread status. Rows stay fast-scrolling even with hundreds of threads (60fps optimized).
- Thread selection — click a thread to open it. selectedThreadId is tracked in app state and reflected in the UI.
- Sender information — each thread shows the sender's name and email address. Helps identify important conversations at a glance.
- Attachment indicators — thread rows show an icon if the email has attachments.
- Message details — open a thread to see the full message with headers, body, and all attachments.
- Attachment caching — frequently accessed attachments are cached locally for instant access. Two-tier LRU storage balances memory and disk.
- Attachment download — download attachments directly from the message view.
Widget Pane, Status Bar & Overlay System
- WidgetPaneView — right-side pane with tabbed interface. Switches between tools like AI Agent, Search, and future extensions. Resizes based on active tab.
- Tab switching — segment control to navigate between different widgets. Tab width adjusts (300px default, 400px for Agent).
- StatusBarView — bottom status bar showing app state (sync progress, unread count, etc.). Uses translucent themed background.
- OverlayCoordinator — manages modal dialogs, alerts, and floating panels. Multiple overlays can coexist and layer properly.
- Modal stacking — overlays are added/removed from a container, maintaining z-order. dismissAll clears all overlays at once.
- Navigation stack — views can be pushed/popped with breadcrumb-like navigation. Same-mode push is a no-op, preventing duplicate states.
- View animations — 0.15s fade crossfade when swapping between views. Smooth visual feedback during navigation.
- Themed colors — all UI elements pull colors from the app theme. StatusBar and overlays automatically adapt to dark mode.
Main Window & Sidebar Navigation
- Three-pane layout — sidebar (folders), thread list (center), and widgets (right).
- SidebarViewController — NSOutlineView displays all Gmail labels and folders. Click to navigate and search within a folder.
- Folder selection — clicking a folder updates activeFolderId, which syncs the thread list and filters to that folder's emails.
- Unread badges — each folder row shows a badge with the count of unread emails. Badges update in real time as emails are read.
- Themed sidebar — folder rows respect the app's color scheme. No hardcoded colors or fonts.
- Layout persistence — window size and pane widths are remembered across sessions (UserDefaults).
- Window sizing — proper minimum size and content layout prevent the window from shrinking into an unusable state.
- Data validation — app verifies all required data systems are initialized before showing the main window.
macOS UI Layer & Account Switcher
- HyperdriveCore singleton — central Swift-side state management that observes the C++ AppState and exposes it to SwiftUI/AppKit views.
- Account switcher UI — dropdown menu in the window header to switch between Gmail accounts. Selection is live-updated across the app.
- Accounts observable — live list of connected accounts. UI automatically reflects additions/removals.
- Active account tracking — tracks which account is selected. All streams (threads, folders, contacts) automatically switch to the active account's data.
- Active folder tracking — tracks which folder/label is selected. Used by thread list and other views to stay in sync.
- FFI bridge — Swift observes C++ app state via FFI. Account/folder changes propagate to the UI in real time.
- Platform lifecycle — HyperdriveCore is initialized at app startup and cleaned up at shutdown.
- Test infrastructure — FFI helpers for inserting test accounts and verifying UI integration.
OAuth Authentication & CI Infrastructure
- OAuth authentication — Engine's auth pipeline integrated. Gmail login flow fully wired with secure credential exchange.
- TokenStore — OAuth tokens stored securely with device fingerprint passphrase. Credentials are encrypted and bound to the device.
- Auth interceptor — all outbound requests automatically include Authorization: Bearer headers with the current token.
- Token refresh — expired tokens are automatically refreshed before requests fail, keeping the user logged in.
- Multi-account support — OAuth config supports multiple Gmail accounts with independent token storage per account.
- Inflight protection extended — pending mutations are preserved during both initial sync and incremental background folder syncs.
- GitHub Actions CI — automated build and test pipeline on every commit. Runs on self-hosted Mac Mini for real-hardware verification.
- Hardened initialization — proper error handling during auth setup. OAuth failures are caught and logged clearly.
Sync Integration & Inflight Protection
- Inflight protection — pending mutations (star, archive, etc.) are preserved during sync. Gmail's version doesn't overwrite your queued changes.
- Grace window — threads are only deleted if they're missing from two consecutive syncs, not just one. Prevents accidental deletion from temporary sync issues.
- Archive persistence — muted (archived) threads stay archived even if Gmail sync brings them back to the Inbox. Local state takes precedence.
- Atomic sync transactions — all database writes during sync are all-or-nothing. Partial sync failures can't corrupt the database.
- Efficient mutation tracking — pending mutations are snapshot-read once per sync page, reducing database traffic.
- Smart merge logic — sync intelligently merges Gmail's data with pending mutations. Fields that have pending changes are preserved.
- Full app bootstrap — HttpClient, GmailClient, SyncSystem, and AppState are all initialized and started when the app launches.
- Clean shutdown — AppState is properly reset on app exit to prepare for next launch.
Complete Email Actions
- Email operations — all user-facing actions are now implemented with full durability and optimistic UI: Star, Unstar, MarkRead, MarkUnread, Trash, Mute (archive), Move, AddLabel, RemoveLabel, and Snooze.
- Label management — add and remove Gmail labels from emails. Supports both Gmail system labels (Inbox, Unread, Starred) and custom labels.
- Archive (Mute) — removing from Inbox archives emails. Muted threads no longer appear in the inbox but remain in the database and can be searched.
- Move between folders — emails can be moved to any Gmail label. Moving automatically removes from the source folder and adds to the destination.
- Snooze — defer emails to a specified time. Snoozed emails are hidden from inbox until the snooze time expires, then reappear automatically.
- Robust error handling — storage failures and malformed payloads are logged with clear messages instead of silently failing.
- Thread-safe replay — background job safely replays queued actions without data races.
- Pre-flight validation — payloads are validated before dispatch to catch errors early.
Durable Actions & Optimistic Updates
- ActionQueue — persists all email mutations (star, unstar, mark read, archive, etc.) to the database before sending to Gmail. Ensures no action is lost even if the app crashes.
- Optimistic updates — when you perform an action, the UI updates instantly. The action is sent to Gmail in the background, and the UI stays responsive.
- Smart reversion — if the Gmail API call fails, the UI automatically reverts to the previous state. Users see a notification that the action failed.
- Offline support — actions are queued when offline. When connectivity returns, the queue automatically replays all pending actions.
- Automatic retry — transient failures (network timeouts, temporary server errors) automatically retry with exponential backoff. Max retry budget prevents endless loops.
- FIFO ordering — actions are replayed in the order they were performed, preserving causality.
- Offline indicator — when offline, the app shows a clear indicator so you know sync is paused.
- Specific actions implemented — Star, Unstar, MarkUnread with full durability and optimistic UI.
Email Sync Engine & Incremental Updates
- SyncSubsystem — core engine that fetches emails from Gmail and keeps them in sync with your local database. Handles full and incremental synchronization.
- Initial inbox load — when you first connect, all threads are fetched from your inbox and stored locally. Handles pagination for large inboxes (up to 10 pages).
- Folder synchronization — all Gmail labels (system and custom) are synced as folders. Keeps folder list up to date in the background.
- Incremental sync — after the initial load, only changes are synced using Gmail's history API. New messages, label changes, and deletions are tracked efficiently.
- Resume capability — sync progress (page tokens, history ID) is saved to the database. If sync is interrupted, it picks up from where it left off.
- Background polling — periodic polling of Gmail history keeps your email list fresh without constant full syncs.
- Proper cleanup — in-flight sync operations are cancelled when stopping to prevent orphaned requests or data corruption.
- Lifecycle management — clear phases (initial sync → folder sync → incremental polling) with proper state transitions and error handling.
Gmail Data Mapping & Network Resilience
- GmailAdapter — converts Gmail API responses into Hyperdrive's internal data format. Handles the full complexity of Gmail's nested message structure and label system.
- Smart thread mapping — read/unread, starred, and inbox status are automatically derived from Gmail labels. The adapter understands Gmail's label conventions.
- Message extraction — email bodies and headers are extracted from Gmail's payload tree structure. Handles both simple text messages and complex MIME structures.
- Attachment handling — automatically extracts regular and inline attachments from messages. Handles edge cases like missing payloads and empty threads.
- Folder mapping — Gmail labels (system and custom) are mapped to folder categories in Hyperdrive.
- Rate limiting — requests to Gmail API are rate-limited to stay within quota. Automatic backoff when Gmail returns rate-limit headers.
- Circuit breaker — if Gmail API starts returning errors, the client temporarily stops making requests to avoid cascading failures.
- Auth retry — authentication headers are automatically injected and refreshed, with retry logic for token expiration.
Swift-to-C++ FFI & Gmail Batch Sync
- C FFI bridge — Swift on macOS can now call C++ app state, observables, and lifecycle management. Enables direct UI binding to core state.
- Complete Gmail API coverage — all PRD-specified endpoints implemented (list threads, get profiles, batch operations, etc.).
- Gmail batch API — efficiently fetch multiple threads and messages in a single HTTP request using Gmail's batch protocol. Engine's MimeParser and MultipartWriter handle the complexity.
- Dependency injection — clean architecture where subsystems declare their dependencies and are activated in the right order.
- Subscription lifecycle — kernel-managed subscription container ensures all observers are cleaned up when subsystems stop.
- Detailed startup progress — lifecycle state changes are observable, so the UI can show step-by-step progress during app initialization.
- Hardened against edge cases — boundary string parsing, JSON batch handling, subsystem activation failures all covered with tests and assertions.
App State & Sync Engine
- AppState — central hub for all application state. Owns the database store and exposes reactive streams for threads, folders, and contacts that automatically update the UI.
- Gmail client — integrated network layer that fetches threads, messages, and profiles from Gmail API. Handles pagination and filtering.
- Reactive streams — threads, folders, and contacts are pushed to the UI whenever they change. The UI stays in sync without polling.
- Account switching — changing accounts automatically switches all active streams (threads, folders, contacts) to the new account's data.
- Subsystem architecture — organized application logic into modular subsystems: Threads, Folders, Contacts, and AccountManager. Each subsystem owns its domain.
- Lifecycle management — app has defined lifecycle states (starting, running, failed, restart). State transitions are observable so the UI can show loading states.
- Thread safety — re-entrancy guards prevent crashes when rapid account switching or state changes happen concurrently.
- Unread tracking — automatic count of unread threads, updated in real time.
Gmail API Integration
- Gmail configuration — client ID, client secret, and OAuth scopes configured for Gmail API access. Environment variables can override defaults for testing.
- Gmail data models — DTOs for all Gmail API responses: threads, messages, labels, profiles, attachments, message metadata, and history tracking.
- JSON parsing — automatic deserialization of Gmail API responses into structured data, with fallback handling for missing fields.
- OAuth authentication — integrated with Engine's GoogleAuthProvider for handling Gmail login and token refresh.
- Reflection system — Gmail models are fully reflectable, enabling automatic serialization and API integration.
- Comprehensive testing — JSON roundtrip tests, boundary case handling, environment override validation, and integration with Engine utilities.
Email Database & Full-Text Search
- Core data models — designed Account, Thread, Message, Folder, Tag, Contact, and Attachment models that store and organize your emails.
- Full-text search indexing — threads and messages are indexed for fast searching so you can find emails instantly without scanning your entire inbox.
- Data integrity — foreign key relationships ensure that emails stay connected to their threads, attachments to messages, and contacts to accounts. Cascading deletes prevent orphaned data.
- Vector support — serialization and deserialization for vector embeddings that power the AI classifier.
- Database migrations — formalized schema versioning and automatic migrations so the database can evolve as features are added.
- Gmail configuration — Account model stores Gmail client ID and secrets, ready for OAuth setup.
- Improved test infrastructure — migrated to Engine's test framework, reducing code duplication and making tests faster.
macOS Integration & Live Theme Switching
- Theme bridge — Swift and C++ now communicate seamlessly. Theme updates sync in real time across the entire app.
- Cross-platform app foundation — centralized startup and state management so the same core logic can run on Mac, iOS, Windows, and Linux.
- Modern build system — replaced legacy Xcode configuration with a cleaner, maintainable setup.
- Live theme switching — windows automatically reflow when you switch themes or toggle dark mode. No restart needed.
- Native color & font mapping — theme values correctly map to macOS colors and fonts, so everything looks native to the platform.
- Code reorganization — standardized naming and restructured directories to match the four-layer architecture design.
- On-device AI ready — integrated NovaEngine's machine learning capabilities for local processing without cloud calls.
NovaEngine Rewrite & Complete Theme System
- Complete architectural rewrite on top of NovaEngine — eliminated legacy Swift AppKit code and moved all logic to a cross-platform C++ foundation. Enables future iOS, Windows, and Linux support with a single codebase.
- Theme system from scratch — built comprehensive theming infrastructure with RGBA color structs, typography configs, layout tokens (spacing, radius), and 9 built-in palettes. Full theme switching with light/dark appearance mode support.
- ThemeEngine — observable theme state management with atomic switches, appearance mode detection, typography preferences, and persistent database storage. Accounts and vector categories have custom color overrides.
- ResolvedPalette — runtime theme + appearance mode resolution with fallback handling. CSS export helpers (rgbaToHex, rgbaToCSSString) for seamless DOM integration.
- Complete test coverage — 50+ tests for theme integrity, palette lookups, spot-checks, and Observable emission on theme/mode switches.
- Four-layer architecture formalized — Core (NovaEngine) → App (AppState, Models) → Systems (Domain logic) → Interface (Platform UI). Strict dependency rules prevent cross-layer coupling.