gitextract_6tjjzw1_/ ├── .github/ │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ ├── docs.yml │ │ └── feature_request.yml │ ├── pull_request_template.md │ └── workflows/ │ ├── packaging.yml │ ├── release-please.yml │ ├── release.yml │ └── update-homebrew.yml ├── .gitignore ├── .release-please-manifest.json ├── CHANGELOG.md ├── CLAUDE.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── com.velomail.app.desktop ├── com.velomail.app.metainfo.xml ├── com.velomail.app.yml ├── docs/ │ ├── architecture.md │ ├── development.md │ └── keyboard-shortcuts.md ├── index.html ├── landing/ │ ├── .gitignore │ ├── README.md │ ├── eslint.config.js │ ├── index.html │ ├── package.json │ ├── public/ │ │ ├── og-image.html │ │ ├── robots.txt │ │ ├── screenshots/ │ │ │ └── .gitkeep │ │ └── sitemap.xml │ ├── src/ │ │ ├── App.css │ │ ├── App.tsx │ │ ├── components/ │ │ │ ├── CtaFooter.tsx │ │ │ ├── Features.tsx │ │ │ ├── Hero.tsx │ │ │ ├── Navbar.tsx │ │ │ ├── OpenSource.tsx │ │ │ ├── ProductShowcase.tsx │ │ │ ├── WhyVelo.tsx │ │ │ └── mockups/ │ │ │ ├── AiMockup.tsx │ │ │ ├── AppMockup.tsx │ │ │ ├── MultiProviderMockup.tsx │ │ │ └── SplitInboxMockup.tsx │ │ ├── index.css │ │ └── main.tsx │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ ├── vite.config.ts │ └── wrangler.jsonc ├── package.json ├── release-please-config.json ├── splashscreen.html ├── src/ │ ├── App.tsx │ ├── ComposerWindow.tsx │ ├── ThreadWindow.tsx │ ├── components/ │ │ ├── accounts/ │ │ │ ├── AccountSwitcher.test.tsx │ │ │ ├── AccountSwitcher.tsx │ │ │ ├── AddAccount.tsx │ │ │ ├── AddCalDavAccount.tsx │ │ │ ├── AddImapAccount.tsx │ │ │ ├── SetupClientId.test.tsx │ │ │ └── SetupClientId.tsx │ │ ├── attachments/ │ │ │ ├── AttachmentGridItem.tsx │ │ │ ├── AttachmentLibrary.test.tsx │ │ │ ├── AttachmentLibrary.tsx │ │ │ └── AttachmentListItem.tsx │ │ ├── calendar/ │ │ │ ├── CalendarList.test.tsx │ │ │ ├── CalendarList.tsx │ │ │ ├── CalendarPage.tsx │ │ │ ├── CalendarReauthBanner.tsx │ │ │ ├── CalendarToolbar.tsx │ │ │ ├── DayView.tsx │ │ │ ├── EventCard.tsx │ │ │ ├── EventCreateModal.tsx │ │ │ ├── EventDetailModal.tsx │ │ │ ├── MonthView.tsx │ │ │ └── WeekView.tsx │ │ ├── composer/ │ │ │ ├── AddressInput.test.tsx │ │ │ ├── AddressInput.tsx │ │ │ ├── AiAssistPanel.tsx │ │ │ ├── AttachmentPicker.tsx │ │ │ ├── Composer.tsx │ │ │ ├── EditorToolbar.tsx │ │ │ ├── FromSelector.tsx │ │ │ ├── ScheduleSendDialog.tsx │ │ │ ├── SignatureSelector.tsx │ │ │ ├── TemplatePicker.tsx │ │ │ ├── UndoSendToast.tsx │ │ │ └── scheduleSendPresets.test.ts │ │ ├── dnd/ │ │ │ ├── DndProvider.test.ts │ │ │ └── DndProvider.tsx │ │ ├── email/ │ │ │ ├── ActionBar.tsx │ │ │ ├── AttachmentList.test.tsx │ │ │ ├── AttachmentList.tsx │ │ │ ├── AuthBadge.test.tsx │ │ │ ├── AuthBadge.tsx │ │ │ ├── AuthWarningBanner.test.tsx │ │ │ ├── AuthWarningBanner.tsx │ │ │ ├── CategoryTabs.test.tsx │ │ │ ├── CategoryTabs.tsx │ │ │ ├── ContactSidebar.test.tsx │ │ │ ├── ContactSidebar.tsx │ │ │ ├── EmailRenderer.test.tsx │ │ │ ├── EmailRenderer.tsx │ │ │ ├── FollowUpDialog.tsx │ │ │ ├── InlineAttachmentPreview.test.tsx │ │ │ ├── InlineAttachmentPreview.tsx │ │ │ ├── InlineReply.tsx │ │ │ ├── LinkConfirmDialog.tsx │ │ │ ├── MessageItem.test.tsx │ │ │ ├── MessageItem.tsx │ │ │ ├── MoveToFolderDialog.test.tsx │ │ │ ├── MoveToFolderDialog.tsx │ │ │ ├── PhishingBanner.tsx │ │ │ ├── RawMessageModal.test.tsx │ │ │ ├── RawMessageModal.tsx │ │ │ ├── SmartReplySuggestions.tsx │ │ │ ├── SnoozeDialog.tsx │ │ │ ├── ThreadCard.test.tsx │ │ │ ├── ThreadCard.tsx │ │ │ ├── ThreadSummary.tsx │ │ │ └── ThreadView.tsx │ │ ├── help/ │ │ │ ├── HelpCard.tsx │ │ │ ├── HelpCardGrid.tsx │ │ │ ├── HelpPage.tsx │ │ │ ├── HelpSearchBar.tsx │ │ │ ├── HelpSidebar.tsx │ │ │ ├── HelpTooltip.tsx │ │ │ └── helpContentSearch.test.ts │ │ ├── labels/ │ │ │ └── LabelForm.tsx │ │ ├── layout/ │ │ │ ├── EmailList.tsx │ │ │ ├── MailLayout.tsx │ │ │ ├── ReadingPane.tsx │ │ │ ├── Sidebar.tsx │ │ │ └── TitleBar.tsx │ │ ├── search/ │ │ │ ├── AskInbox.tsx │ │ │ ├── CommandPalette.tsx │ │ │ ├── SearchBar.tsx │ │ │ └── ShortcutsHelp.tsx │ │ ├── settings/ │ │ │ ├── CalDavSettings.tsx │ │ │ ├── ContactEditor.tsx │ │ │ ├── FilterEditor.tsx │ │ │ ├── LabelEditor.test.tsx │ │ │ ├── LabelEditor.tsx │ │ │ ├── QuickStepEditor.tsx │ │ │ ├── SettingsPage.tsx │ │ │ ├── SignatureEditor.test.tsx │ │ │ ├── SignatureEditor.tsx │ │ │ ├── SmartFolderEditor.tsx │ │ │ ├── SmartLabelEditor.test.tsx │ │ │ ├── SmartLabelEditor.tsx │ │ │ ├── SubscriptionManager.tsx │ │ │ └── TemplateEditor.tsx │ │ ├── tasks/ │ │ │ ├── AiTaskExtractDialog.tsx │ │ │ ├── TaskItem.test.tsx │ │ │ ├── TaskItem.tsx │ │ │ ├── TaskQuickAdd.tsx │ │ │ ├── TaskSidebar.tsx │ │ │ └── TasksPage.tsx │ │ └── ui/ │ │ ├── Button.test.tsx │ │ ├── Button.tsx │ │ ├── ConfirmDialog.test.tsx │ │ ├── ConfirmDialog.tsx │ │ ├── ContextMenu.test.tsx │ │ ├── ContextMenu.tsx │ │ ├── ContextMenuPortal.tsx │ │ ├── DateTimePickerDialog.test.tsx │ │ ├── DateTimePickerDialog.tsx │ │ ├── EmptyState.tsx │ │ ├── ErrorBoundary.test.tsx │ │ ├── ErrorBoundary.tsx │ │ ├── InputDialog.test.tsx │ │ ├── InputDialog.tsx │ │ ├── Modal.test.tsx │ │ ├── Modal.tsx │ │ ├── OfflineBanner.tsx │ │ ├── Skeleton.tsx │ │ ├── TextField.test.tsx │ │ ├── TextField.tsx │ │ ├── UpdateToast.test.tsx │ │ ├── UpdateToast.tsx │ │ └── illustrations/ │ │ ├── GenericEmptyIllustration.tsx │ │ ├── InboxClearIllustration.tsx │ │ ├── NoAccountIllustration.tsx │ │ ├── NoSearchResultsIllustration.tsx │ │ ├── ReadingPaneIllustration.tsx │ │ └── index.ts │ ├── config/ │ │ └── tauriConfig.test.ts │ ├── constants/ │ │ ├── helpContent.test.ts │ │ ├── helpContent.ts │ │ ├── shortcuts.test.ts │ │ ├── shortcuts.ts │ │ ├── themes.test.ts │ │ └── themes.ts │ ├── hooks/ │ │ ├── useClickOutside.ts │ │ ├── useContextMenu.ts │ │ ├── useKeyboardShortcuts.test.ts │ │ ├── useKeyboardShortcuts.ts │ │ ├── useRouteNavigation.test.ts │ │ └── useRouteNavigation.ts │ ├── main.tsx │ ├── router/ │ │ ├── index.ts │ │ ├── navigate.test.ts │ │ ├── navigate.ts │ │ └── routeTree.tsx │ ├── services/ │ │ ├── ai/ │ │ │ ├── aiService.test.ts │ │ │ ├── aiService.ts │ │ │ ├── askInbox.ts │ │ │ ├── categorizationManager.ts │ │ │ ├── errors.ts │ │ │ ├── prompts.ts │ │ │ ├── providerFactory.test.ts │ │ │ ├── providerFactory.ts │ │ │ ├── providerManager.test.ts │ │ │ ├── providerManager.ts │ │ │ ├── providers/ │ │ │ │ ├── claudeProvider.ts │ │ │ │ ├── copilotProvider.test.ts │ │ │ │ ├── copilotProvider.ts │ │ │ │ ├── geminiProvider.ts │ │ │ │ ├── ollamaProvider.test.ts │ │ │ │ ├── ollamaProvider.ts │ │ │ │ └── openaiProvider.ts │ │ │ ├── taskExtraction.test.ts │ │ │ ├── taskExtraction.ts │ │ │ ├── types.ts │ │ │ ├── writingStyleService.test.ts │ │ │ └── writingStyleService.ts │ │ ├── attachments/ │ │ │ ├── cacheManager.test.ts │ │ │ ├── cacheManager.ts │ │ │ ├── preCacheManager.test.ts │ │ │ └── preCacheManager.ts │ │ ├── backgroundCheckers.test.ts │ │ ├── backgroundCheckers.ts │ │ ├── badgeManager.ts │ │ ├── bundles/ │ │ │ └── bundleManager.ts │ │ ├── calendar/ │ │ │ ├── autoDiscovery.test.ts │ │ │ ├── autoDiscovery.ts │ │ │ ├── caldavProvider.test.ts │ │ │ ├── caldavProvider.ts │ │ │ ├── googleCalendarProvider.test.ts │ │ │ ├── googleCalendarProvider.ts │ │ │ ├── icalHelper.test.ts │ │ │ ├── icalHelper.ts │ │ │ ├── providerFactory.test.ts │ │ │ ├── providerFactory.ts │ │ │ └── types.ts │ │ ├── categorization/ │ │ │ ├── backfillService.test.ts │ │ │ ├── backfillService.ts │ │ │ ├── ruleEngine.test.ts │ │ │ └── ruleEngine.ts │ │ ├── composer/ │ │ │ ├── draftAutoSave.test.ts │ │ │ └── draftAutoSave.ts │ │ ├── contacts/ │ │ │ └── gravatar.ts │ │ ├── db/ │ │ │ ├── accounts.test.ts │ │ │ ├── accounts.ts │ │ │ ├── aiCache.ts │ │ │ ├── attachments.test.ts │ │ │ ├── attachments.ts │ │ │ ├── bundleRules.test.ts │ │ │ ├── bundleRules.ts │ │ │ ├── calendarEvents.test.ts │ │ │ ├── calendarEvents.ts │ │ │ ├── calendars.test.ts │ │ │ ├── calendars.ts │ │ │ ├── connection.test.ts │ │ │ ├── connection.ts │ │ │ ├── contacts.test.ts │ │ │ ├── contacts.ts │ │ │ ├── filters.ts │ │ │ ├── folderSyncState.test.ts │ │ │ ├── folderSyncState.ts │ │ │ ├── followUpReminders.ts │ │ │ ├── imageAllowlist.test.ts │ │ │ ├── imageAllowlist.ts │ │ │ ├── labels.test.ts │ │ │ ├── labels.ts │ │ │ ├── linkScanResults.ts │ │ │ ├── localDrafts.test.ts │ │ │ ├── localDrafts.ts │ │ │ ├── messages.test.ts │ │ │ ├── messages.ts │ │ │ ├── migrations.test.ts │ │ │ ├── migrations.ts │ │ │ ├── notificationVips.ts │ │ │ ├── pendingOperations.test.ts │ │ │ ├── pendingOperations.ts │ │ │ ├── phishingAllowlist.ts │ │ │ ├── quickSteps.test.ts │ │ │ ├── quickSteps.ts │ │ │ ├── scheduledEmails.ts │ │ │ ├── search.ts │ │ │ ├── sendAsAliases.test.ts │ │ │ ├── sendAsAliases.ts │ │ │ ├── settings.ts │ │ │ ├── signatures.ts │ │ │ ├── smartFolders.test.ts │ │ │ ├── smartFolders.ts │ │ │ ├── smartLabelRules.test.ts │ │ │ ├── smartLabelRules.ts │ │ │ ├── tasks.test.ts │ │ │ ├── tasks.ts │ │ │ ├── templates.ts │ │ │ ├── threadCategories.ts │ │ │ ├── threads.test.ts │ │ │ ├── threads.ts │ │ │ ├── writingStyleProfiles.test.ts │ │ │ └── writingStyleProfiles.ts │ │ ├── deepLinkHandler.ts │ │ ├── email/ │ │ │ ├── gmailProvider.test.ts │ │ │ ├── gmailProvider.ts │ │ │ ├── imapSmtpProvider.test.ts │ │ │ ├── imapSmtpProvider.ts │ │ │ ├── providerFactory.test.ts │ │ │ ├── providerFactory.ts │ │ │ └── types.ts │ │ ├── emailActions.test.ts │ │ ├── emailActions.ts │ │ ├── filters/ │ │ │ ├── filterEngine.test.ts │ │ │ └── filterEngine.ts │ │ ├── followup/ │ │ │ └── followupManager.ts │ │ ├── globalShortcut.ts │ │ ├── gmail/ │ │ │ ├── auth.test.ts │ │ │ ├── auth.ts │ │ │ ├── authParser.test.ts │ │ │ ├── authParser.ts │ │ │ ├── client.test.ts │ │ │ ├── client.ts │ │ │ ├── draftDeletion.test.ts │ │ │ ├── draftDeletion.ts │ │ │ ├── messageParser.test.ts │ │ │ ├── messageParser.ts │ │ │ ├── sendAs.test.ts │ │ │ ├── sendAs.ts │ │ │ ├── sync.test.ts │ │ │ ├── sync.ts │ │ │ ├── syncManager.test.ts │ │ │ ├── syncManager.ts │ │ │ └── tokenManager.ts │ │ ├── google/ │ │ │ └── calendar.ts │ │ ├── imap/ │ │ │ ├── autoDiscovery.test.ts │ │ │ ├── autoDiscovery.ts │ │ │ ├── folderMapper.test.ts │ │ │ ├── folderMapper.ts │ │ │ ├── imapConfigBuilder.test.ts │ │ │ ├── imapConfigBuilder.ts │ │ │ ├── imapSync.test.ts │ │ │ ├── imapSync.ts │ │ │ ├── messageHelper.test.ts │ │ │ ├── messageHelper.ts │ │ │ ├── tauriCommands.test.ts │ │ │ └── tauriCommands.ts │ │ ├── notifications/ │ │ │ └── notificationManager.ts │ │ ├── oauth/ │ │ │ ├── oauthFlow.test.ts │ │ │ ├── oauthFlow.ts │ │ │ ├── oauthTokenManager.test.ts │ │ │ ├── oauthTokenManager.ts │ │ │ ├── providers.test.ts │ │ │ └── providers.ts │ │ ├── phishing/ │ │ │ └── phishingScanner.ts │ │ ├── queue/ │ │ │ ├── queueProcessor.test.ts │ │ │ └── queueProcessor.ts │ │ ├── quickSteps/ │ │ │ ├── defaults.ts │ │ │ ├── executor.test.ts │ │ │ ├── executor.ts │ │ │ └── types.ts │ │ ├── search/ │ │ │ ├── searchParser.test.ts │ │ │ ├── searchParser.ts │ │ │ ├── searchQueryBuilder.test.ts │ │ │ ├── searchQueryBuilder.ts │ │ │ ├── smartFolderQuery.test.ts │ │ │ └── smartFolderQuery.ts │ │ ├── smartLabels/ │ │ │ ├── backfillService.test.ts │ │ │ ├── backfillService.ts │ │ │ ├── smartLabelManager.test.ts │ │ │ ├── smartLabelManager.ts │ │ │ ├── smartLabelService.test.ts │ │ │ └── smartLabelService.ts │ │ ├── snooze/ │ │ │ ├── scheduledSendManager.ts │ │ │ └── snoozeManager.ts │ │ ├── tasks/ │ │ │ ├── taskManager.test.ts │ │ │ └── taskManager.ts │ │ ├── threading/ │ │ │ ├── threadBuilder.test.ts │ │ │ └── threadBuilder.ts │ │ ├── unsubscribe/ │ │ │ └── unsubscribeManager.ts │ │ ├── updateManager.test.ts │ │ └── updateManager.ts │ ├── stores/ │ │ ├── accountStore.test.ts │ │ ├── accountStore.ts │ │ ├── composerStore.test.ts │ │ ├── composerStore.ts │ │ ├── contextMenuStore.test.ts │ │ ├── contextMenuStore.ts │ │ ├── labelStore.test.ts │ │ ├── labelStore.ts │ │ ├── shortcutStore.ts │ │ ├── smartFolderStore.test.ts │ │ ├── smartFolderStore.ts │ │ ├── taskStore.test.ts │ │ ├── taskStore.ts │ │ ├── threadStore.test.ts │ │ ├── threadStore.ts │ │ ├── uiStore.test.ts │ │ └── uiStore.ts │ ├── styles/ │ │ └── globals.css │ ├── test/ │ │ ├── mocks/ │ │ │ ├── db.mock.ts │ │ │ ├── entities.mock.ts │ │ │ ├── index.ts │ │ │ ├── services.mock.ts │ │ │ ├── stores.mock.ts │ │ │ └── tauri.mock.ts │ │ └── setup.ts │ ├── utils/ │ │ ├── crypto.test.ts │ │ ├── crypto.ts │ │ ├── date.ts │ │ ├── emailBuilder.test.ts │ │ ├── emailBuilder.ts │ │ ├── emailUtils.test.ts │ │ ├── emailUtils.ts │ │ ├── fileTypeHelpers.test.ts │ │ ├── fileTypeHelpers.ts │ │ ├── fileUtils.test.ts │ │ ├── fileUtils.ts │ │ ├── imageBlocker.test.ts │ │ ├── imageBlocker.ts │ │ ├── imageResize.ts │ │ ├── mailtoParser.test.ts │ │ ├── mailtoParser.ts │ │ ├── networkErrors.test.ts │ │ ├── networkErrors.ts │ │ ├── noReply.test.ts │ │ ├── noReply.ts │ │ ├── phishingDetector.test.ts │ │ ├── phishingDetector.ts │ │ ├── resolveFromAddress.test.ts │ │ ├── resolveFromAddress.ts │ │ ├── sanitize.test.ts │ │ ├── sanitize.ts │ │ ├── templateVariables.test.ts │ │ ├── templateVariables.ts │ │ ├── timestamp.test.ts │ │ └── timestamp.ts │ └── vite-env.d.ts ├── src-tauri/ │ ├── .gitignore │ ├── Cargo.toml │ ├── Entitlements.plist │ ├── build.rs │ ├── capabilities/ │ │ └── default.json │ ├── icons/ │ │ ├── android/ │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ └── ic_launcher.xml │ │ │ └── values/ │ │ │ └── ic_launcher_background.xml │ │ └── icon.icns │ ├── src/ │ │ ├── commands.rs │ │ ├── imap/ │ │ │ ├── client.rs │ │ │ ├── mod.rs │ │ │ └── types.rs │ │ ├── lib.rs │ │ ├── main.rs │ │ ├── oauth.rs │ │ └── smtp/ │ │ ├── client.rs │ │ ├── mod.rs │ │ └── types.rs │ └── tauri.conf.json ├── tsconfig.json ├── velo.spec ├── vite.config.ts └── vitest.config.ts