// changelog
Shipped weekly, tracked openly.
Every update, fix, and improvement that lands in NeatMail.37 releases · 393 documented changes
Latest2026-07-20
v1.27.0Version 1.27.0
Added
- Engagement-based auto-archive rules — auto-mute senders a user consistently ignores
- Feedback survey integration in the app
Changed
- Email handling excludes self-sent messages from tracking and processing
// previous releases
v1.26.02026-07-18
Added
- First-run inbox sweep with preview and one-click undo
- Auto-archive functionality for user tags
Changed
- Onboarding flow updated with trial plan features and savings display
- First-run sweep refined to exclude only starred messages and count conversations accurately
- Dashboard components reorganized for improved layout and clarity
Removed
- InsightHighlights component and related new-senders logic
v1.25.02026-07-16
Added
- Extra mailbox add-ons for subscriptions — paid seats via DodoPay
- `ConfirmDialog` for consistent destructive-action confirmations in TeamSettings
- Teammate referral guard to prevent circular rewards
- "Mailboxes" feature label; `formatFeatures` updated for tier limits
- Migration to backfill solo organizations for pre-existing signups
Changed
- Payment region inference switched from currency-based to plan-based resolution
- Presentment currency handling for recurring charges and credits (`d088e63`); `presentmentRecurring` renamed to `planRecurring`
- `ExtraMailboxesCard` region logic now uses geo information (`e357d45`); styling improved
- Billing page enhanced with additional information and support contact
- OAuth error handling and reconnect notifications enhanced for Gmail and Outlook
- README enhanced with clearer description, links, and team/industry use cases
Fixed
- `DodoDisputeData.amount` corrected to string, matching DodoPay's webhook contract
v1.24.02026-07-14
Added
- Organizations & teams — `organization` and `organization_members` models with roles
- Organization-aware billing tier resolution for users
- Organization hooks for invite, team, and member management
- Organization API, pages, components, and route registration
- Schema org fields and migrations for invite tokens, member active flag, and trial flag
Changed
- Checkout, subscription, billing page, and user deletion updated with org support
- AppSidebar, user settings, sign-in, onboarding, and Resend lib updated for orgs
- Outlook workers, watch activation, cron, and Gmail webhook updated for orgs
v1.23.02026-07-12
Added
- Gmail processing queues and workers for incoming and sent messages
- Per-user burst limiter for Gmail processing to prevent mailbox flooding
- Edit-label functionality with validation and API integration
- New favicon assets and updated metadata for branding
Changed
- Migrated from Azure OpenAI to the OpenAI API
- Classification polling timeout extended from 60s to 600s
- Checkbox replaced with Switch in user preferences; save-state handling enhanced
- Input validation for tag name/description; Dashboard greeting logic refined
v1.22.02026-07-09
Added
- Referral system — referral code generation, tracking, and rewards
- Billing portal access for subscriptions on hold
v1.21.02026-07-07
Added
- Chat session management and message persistence
- Follow-up feature with a mandatory "Resolved" tag and related checks
- Keyword-based attachment search for Outlook; fallback to most recent candidate for generic requests
Changed
- Email handling refactored to provider-agnostic types; Gmail/Outlook-specific implementations removed
- Chat markdown styling improved; email date formatting enhanced
Removed
- "Discussion" label and related checks from email processing
v1.20.02026-07-02
Added
- Attachment auto-resolution for drafts — file retrieval and attachment capabilities
- Email subject and confidence level included in attachment resolution
- Follow-up email functionality in the daily digest
- Carousel on the sign-in page with new imagery
- Comprehensive agent guide (`CLAUDE.md`) — build, architecture, pricing, and API details
Changed
- Onboarding page enhanced with trust and reassurance messaging for card verification
- Sign-in page header and description updated for clarity
Fixed
- Pricing tiers updated for Pro and Max; free-tier option removed
- Tier degraded on trial expiry; watch deactivated on delete; watch teardown hardened
v1.19.02026-06-29
Added
- Card-required free trial logic with an enhanced onboarding flow
- Trial reminder system for card-required free trials
- Reconnect reminder system to notify users when an OAuth token is revoked
- `UnsubscribeFailedDialog` for improved unsubscribe error handling
Changed
- Pricing updated for PRO and MAX tiers; tier limits adjusted
- `UserLabel` component handles loading states and stale data
- Navbar and AppSidebar layout spacing; sidebar width normalized
v1.18.02026-06-26
Added
- New-senders tracking endpoint integrated into dashboard insights
- Dashboard email statistics and insights enhanced
Changed
- License updated to Elastic License 2.0; README updated for consistency
- `ConditionalSidebar` hidden on the onboard-complete page
- Google API integration checks Gmail access and scopes
v1.17.02026-06-23
Added
- 4-step onboarding wizard replacing the bare redirect, with an OAuth re-auth flow
- `user_defined` property on tags for identification
Changed
- Sign-in page redesigned with tagline, mascot, and trust badges
- Email digest sent only to users with an active subscription or trial
- Email classification: read-only/discussion tag handling and expanded `noReplyNeeded` read-only signals
Fixed
- "Follow-up" spelling corrected in sidebar items
v1.16.02026-06-19
Added
- Follow-up system — detection, AI draft generation, and preference management
- Follow-up limits and tracking for user preferences
- Follow-up preferences in onboarding; default values in `EmailCategorizationModal`
- Follow-up message handling for Gmail and Outlook — move to inbox, mark unread
- Digest "Completed" tab with a dedicated API; digest section redesigned
- Animated `BeamAvatar` component; `DigestRow` with formatted date/time
Changed
- `DailyDigestEmail` supports `message_id` and `is_gmail` for dynamic email links
- Trimmed digest emails increased from 5 to 10
- Throttling added to the `sendNewMails` endpoint to avoid rate limits
- AI model parameters tuned for follow-up checks
v1.15.02026-06-16
Added
- PostHog tracking for user events and onboarding
- PostHog project token and host wired as Docker build args and env vars
Changed
- User-token upsert enhanced with email and Gmail provider check
- Onboarding page title and sidebar visibility logic updated
- Primary email address prioritized in user-related API responses
v1.14.02026-06-13
Added
- AI chat agent — backend tools (`create_draft`, `trash_messages`, web attachments)
- Chat UI with markdown rendering and sidebar integration
- Onboarding API integrated with the email categorization modal
- Loading steps and interval in `EmailCategorizationModal` during onboarding
Changed
- `react-markdown` and `remark-gfm` added for chat markdown rendering
Fixed
- Chat mobile: `dvh` viewport height, safe-area padding, reduced padding on small screens
Docs
- `DESIGN.md` added to `notion/`
v1.13.02026-06-12
Added
- Free trial activation with onboarding integration
- `OAuthError` class with enhanced error handling in the Gmail client
- NeatMail footer on Gmail and Outlook draft emails
Changed
- Tier-based feature restrictions and UI updates for free users
- Confetti animation on the onboarding success dialog
- Classification batch size reduced from 10 to 5
- "Action Needed" tag renamed to "Automated alerts"
Fixed
- Free trial users can select the PRO plan in billing
- History ID updated as a string in Gmail webhook processing
v1.12.02026-06-07
Added
- Tier system — `Tier` enum and field on `user_tokens` with migration
- Core tier infrastructure — limits, webhook sync, tier hooks
- Tier-aware API endpoints — checkout, changePlan, preview, trial, limits
- Frontend tier gating, onboarding flow, billing cards, and plan preview dialog
- Region-aware pricing with INR support
- Draft count tracking with tier-based access control
Changed
- Existing PRO subscribers upgraded to MAX tier; support features enhanced
- Trial subscription tier set to MAX
- Watch renewal supported for free users in cron
Docs
- Env example updated with tier product IDs; pricing strategy doc added
v1.11.02026-06-02
Added
- Health check endpoint at `/api/health`
- Batch email classification via a Redis buffer queue
Changed
- Draft `MAX_OUTPUT_TOKENS` increased from 600 to 4096 to prevent length truncation
- Draft style mirroring expanded — emojis, expressiveness, capitalization, abbreviations, sign-offs
- Draft prompt uses natural human replies instead of bracket placeholders
- GitHub repo resolution enhanced
Fixed
- Empty OpenAI response guarded to prevent a JSON parse crash
- Batch deduplicated by `message_id` to prevent ON CONFLICT error 21000
- GitHub global search fallback removed to prevent leaking unrelated public repos
v1.10.02026-05-31
Added
- Redis-buffered batch email inserts via BullMQ
Changed
- Docker image size reduced ~82% (900MB → 160MB) with Alpine + in-process workers
- `SubscriptionModal` redesigned; `media-src` added for Cloudinary
Fixed
- Calendar timezone handling — DB timezone over ISO offset, FreeBusy cross-checked with `events.list`
- ISO 8601 interval format handled from the draft API
- Regex character-class range bug in `timePart` extraction
- Docker/Alpine build fixes — bash dependency, `oven/bun` image, `@bull-board` runtime copy
- Instrumentation and workers restricted to the Node.js runtime
v1.9.02026-05-29
Added
- Dashboard UI refreshed
Changed
- Background job processing migrated from Inngest to BullMQ
- Bull Board auth hardened — rate limiting, timing-safe comparison, audit logging, min password length
Fixed
- 404 handled gracefully when messages are manually deleted by the user
- Unsubscribe shows "Message already deleted or moved" on 404; error field checked even on HTTP 200
- BullMQ: keep last 50 completed jobs, increased `lockDuration`; `removeOnComplete` reverted to prevent Redis RDB bloat
Docs
- Inngest references updated to BullMQ across README, AGENTS.md, and `tags.ts`
v1.8.02026-05-27
Added
- Daily Digest — schema and AI summary/action pipeline
- Daily digest backend with cron job and email template
- Digest UI pages with restructured sidebar
- Message body retrieval and reply functionality in the digest section
Changed
- Email tracking uses `isDone` instead of `is_read`
- Google verification check added in OAuth
Fixed
- Digest preferences no longer auto-created on GET; default enabled state is false
- `supabase.ts` encryption handling corrected for non-empty strings
Security
- `ai_summary` and `ai_action` encrypted at rest
v1.7.02026-05-26
Added
- GitHub integration for context fetching and issue retrieval in email drafts
- Notion integration with context fetching and relevant page extraction
- HubSpotProvider enhanced with methods for fetching notes, tasks, and tickets
- User deletion functionality in draft and model services with error handling
- Google verification email handling for history sync in email route
- Gmail integration enhancement with client retrieval and quota limits in throttle.ts
- Caching for known repositories in GitHubProvider
- Stopword package integrated in GitHub and HubSpot providers
Changed
- GitHubProvider simplified — removed router/scoring, uses Promise.allSettled + unified fetchWithTimeout
- Unnecessary logging removed in GitHub and Notion providers; logging added in HubSpot
- Reply generation rules clarified with explicit checks for missing information
- Timeout duration increased for context fetching and guidance on missing information updated
- getLastSentMessageInThreadOutlook optimized by directly querying sent items
- Condition updated to check for top pages in NotionProvider context fetching
Docs
- Google API quota reference and rate limits for Gmail and Calendar APIs
v1.6.02026-05-24
Added
- HubSpot integration with context fetching and UI components
- Last message retrieval for email threads in Gmail and Outlook
- Email draft processing with user name integration and context formatting
- Trial status response for users with active trials in subscription checks
- Prompt engineering patterns skill to skills-lock.json
Changed
- Output token limit adjusted with guidelines for reply generation length
- Output token limit increased; helper functions exported for better accessibility
- .agents/skills removed from tracking and added to .gitignore
v1.5.02026-05-21
Added
- Reply functionality for Gmail and Outlook conversations with FollowUps UI integration
v1.4.02026-05-20
Added
- `NotSubscribedState` component using `premium.svg` with default "Go to Billing" link
- Subscription gating on FollowUps, EmailStats (unsubscribe), and StorageAnalysis pages
- `enabled` parameter on `useGetSentEmails`, `useGetUserEmailStats`, and `useGetFilteredEmails` hooks to skip API calls for unsubscribed users
v1.3.02026-05-19
Added
- Throttling mechanism for API requests using Redis
v1.2.02026-05-18
Added
- `reminder_sent_at` field to Subscription model for tracking reminder delivery
- Cache-Control header to improve caching strategy
- FollowUps button text updated to indicate email client
Changed
- next.config settings enhanced for image handling and headers
- Code structure refactored for improved readability and maintainability
v1.1.02026-05-16
Added
- Follow-ups page showing sent emails awaiting replies
- Changelog to document project updates and version history
Fixed
- Outlook ID handling updated to support multiple IDs in renewal process and various functions
v1.0.02026-05-15
Added
- Watched folders functionality with Outlook integration
- Active folder data in Outlook subscription creation
- Language selection to draft preferences, piped through draft creation
- Slack integration — OAuth flow, context provider, API routes, and UI
- Slack provider with search, context retrieval, and user connection check
Fixed
- Debug logs removed from Gmail and Outlook label correction processing
- Debug logs removed from SlackProvider fetchContext and buildQuery
- Slack search parameters updated: count to 6, sort by score
- Async handling for Slack token decryption
- Layout adjustments for folder selection in WatchedFolderSelect
Changed
- activeFolder function corrected to filter and map folder data properly
v0.9.02026-05-10
Added
- Storage analysis page: find and delete large emails by size and date range
- ErrorState component replacing Alert in EmailStats and StorageAnalysis
- PageTransition component for animated page transitions
- AppSidebar animated active indicator with layout grouping
- One-Click Cleanup feature image in README
- Badge UI component with variants
- Pagination for email retrieval with nextPageToken and maxResults
- DeleteOutlookMessage function and email deletion logic
- Outlook message archiving with enhanced filtering
Fixed
- Date validation schema and error handling for date queries in email and stats routes
- Audience URL in Gmail webhook now uses environment variable
- Syncing message clarifies inbox reference
Changed
- Sidebar restructured with Cleanup section and refined navigation
- getGmailClient simplified: Redis caching and in-process token cache removed
- Code structure refactored for readability and maintainability
Removed
- entity-extractor.ts file and associated OpenAI integration
- User privacy settings and related API endpoints
v0.8.02026-05-01
Added
- Auto-archive functionality for Gmail and Outlook messages
- Archive rules management in API
- Gmail historical data sync via API endpoint and React hook
- Outlook email history sync and retrieval
- Read vs Unread component with API integration for 7-day stats
- MostEmails component for tracking top email senders
- Date range picker on dashboard with component updates
- Skip processing for users not subscribed to archiving rules
Fixed
- Clutter component layout, loading states, and unsubscribe options
- Archive option alignment in EmailStats
- Layout and responsiveness in EmailStats
- Login.svg added to public folder
- Total days calculation for email metrics
- Margin adjustments in Clutter and MostEmails components
- Take limits in stats API for clutter and top labels queries
- Greeting calculation optimized with useMemo
- Dashboard greeting subtitles and LabelDistribution colors
- Time period references from month to week
- Traffic data metrics and trend rendering
Changed
- Debounced date handling in dashboard for performance
- Email count logic simplified, date range extended
- archiveMessages renamed to trashMessages with updated response
- Archive flow simplified to button + duration selection
- TruncateLabel function limits domain display in EmailStats
Removed
- MailsByDay component and associated data fetching
v0.7.02026-04-20
Added
- OpenAI agent for Gmail interaction and email drafting via Telegram
- HTML-to-text dependency and Telegram HTML formatting functions
- Automated alerts for email categorization
- Global API rate limiting with dynamic response headers
- ioredis migration from Upstash Redis
- MailsByDay component with time-saved metrics
- Daily email statistics API integration
Fixed
- Console logging for missing user token includes clerk user ID
- Email labeling logic refined, redundant conditions removed
- inngest downgraded to 3.54.0 for compatibility
Changed
- Agentic workflow optimized with compact search and increased buffer
- Agentic loop token usage optimized via result compression
- OpenAI model updated from gpt-5.4-mini to gpt-5-mini
- Font sizes increased in MailsByDay and LabelDistribution
- Color scheme updated in MailsByDay
- Take limits increased for clutter and top labels queries
v0.6.02026-04-10
Added
- HeatMap component for inbox traffic and focus time visualization
- Clutter component with hooks for clutter data management
- Stats route for email metrics and engagement analysis
- EmailStats component and fetching hooks
- Endpoint to fetch email statistics by domain
- Email unsubscribe functionality — link extraction, redirect handling
- Outlook mail event update and webhook integration
- Domain, is_read, and rawDomain fields in email_tracked model
- Gmail API client with caching, message fetching, parsing, and drafting
- WelcomeDialog component for onboarding
Fixed
- Gmail attachment ID rotation handled by falling back to first available
- Sender name and email assignment in Outlook mail processing
- Email body snippet sanitization — HTML character escaping
- Various console logs removed from Gmail processing
- Truncation of email body for snippet in processing
Changed
- HeatMap color scheme improved for clarity
- LabelDistribution background colors updated
- Clutter component styling: Avatar variant, gap, layout
- Domain encryption uses libsodium with deterministic nonce
- Sidebar updated: "Mails" → "Unsubscribe", icon to Shredder
- Email classification enhanced with tag matching and category normalization
- Classification rules refined for automated emails and response requirements
- Sensitivity handling updated across processing functions
v0.5.02026-03-28
Added
- Telegram integration for email notifications and management
- Quick reply options and draft notification for Telegram
- telegramPendingDraft table with unique constraint on chat_id
- Gmail draft update and send functions with OpenAI text corrections
- deleteGmailDraft function and route integration
- checkAndForwardToTelegram with tagName support
- Forward important mails and draft confirmation fields to TelegramIntegration
- Integration rules model with user_tokens relation
- Telegram query processing function with routing
- sendTelegramMessage function for notifications
- HTML escaping in handleTelegramQuery response
- Attachment handling in Gmail and Telegram messaging
- Chat history management with Redis in handleTelegramQuery
- Feedback link in AppSidebar, "Delete Account" → "Danger Zone"
Fixed
- Telegram webhook route matcher corrected
- Response for unsubscribed users returns JSON
- Subscription check added before Telegram messages
- Rotating Gmail attachment IDs handled by fallback
- Debug logs removed from attachment retrieval
Changed
- OpenAI model updated from gpt-5.4-mini to gpt-5-mini
- getModelTagsUser removed, tag references updated in email processing
- Logging enhanced in checkAndForwardToTelegram
v0.4.02026-03-15
Added
- Context engine with email entity extraction and Google Calendar integration
- Draft context API and processing with context generation
- Outlook calendar integration for draft processing
- getGmailMessageBody function for full email body retrieval
- Email classification with response requirement in OpenAI
- Sensitivity field in draft_preference model and related types
- Timezone support in draft preferences and processing
- "Read only" label for specific email categories
- Description field in tag model and UserTag
- User Gmail status retrieval with label settings integration
- Development route for Microsoft OAuth token retrieval
Fixed
- Timezone encoding in Google Calendar API requests
- Google Calendar queries respect local timezone boundaries
- Variable names corrected for token and email body in draft processing
- GPT model deployment name corrected to gpt-5-mini
Changed
- OpenAI classifier replaces model classification in email processing
- classifyEmail enhanced with available categories in prompt
- max_completion_tokens increased from 20 to 40
- Label handling simplified, CATEGORY_UPDATES check removed
- classifyEmail simplified, unused generateEmailReply removed
- response_required handling removed from classification
- Email body extraction simplified — HTML handling removed
- Full email body retrieved and truncated for snippet
- Classification rules updated for priority and semantic context
- Category descriptions updated for clarity
- Conflict messaging shows all busy slots
- Calendar providers privacy menu item commented out
v0.3.02026-03-05
Added
- Microsoft Outlook integration — webhook, subscription management, email fetching
- Outlook email processing and label correction
- Outlook watch and subscription renewal support
- Outlook preset field in tag model
- is_folder field in user_tokens model for folder categorization
- UpdateFolderPreference component with folder messaging
- Customer portal with payment history and subscription handling
- Billing component on billing page
- DodoPayments integration for payment processing
- GitHub Actions workflow for production database migration
- Initial database migration: user_tokens, tag, and related tables
- Gmail API history and message retrieval error handling
Fixed
- Subscription query filters by next billing date and cancellation status
- activateWatch uses clerk_user_id instead of dodoSubscriptionId
- Default value of is_folder set to false
- Model deployment name corrected to gpt-4.1-mini
- /all route error handling and public API route inclusion
- README updated with Outlook integration details
Changed
- Privacy settings description updated with link
- Rate limiting logic enhanced, identifier includes user ID
- Label mapping simplified in classifyEmail
- Email classification rules refined for finance and domain contexts
- Font family updated in globals.css
v0.2.02026-02-14
Added
- DodoPayments checkout session with country-based product selection
- Trial period (14 days) if not previously taken
- Subscription status display and cancel button in Billing
- Wallet balance retrieval in Billing component
- Subscription modal with 7-day free trial offer
- Reserved keywords validation for label names
- Dockerfile with multi-stage build and .dockerignore
- Permissions modal and scope fetching logic
- Custom label creation with description field
- Email classification with axios integration
- Cron job endpoint for user deletion
- Watch renewal endpoint for active subscriptions
- Refund processing endpoint with automated logic
- Login.svg asset
- API timeout increased to 120 seconds
Fixed
- Subscription status handling extended in addSubscriptiontoDb
- User subscription check in Gmail webhook handler
- Hardcoded user check removed from addSubscriptiontoDb
- Wallet balance display reflects correct value
- Checkbox and button disabled when user is unsubscribed
- Timestamp fields updated to Timestamptz
- Subscription queries ordered by updatedAt
- Authorization header validation in Gmail webhook
- Package vulnerabilities fixed
- Domain updated from neatmail.tech to neatmail.app in CSP
Changed
- TrackedEmail component layout, header, and sender formatting
- README updated with Docker support, environment config
- Endpoint renamed from /create to /addTagtoUser
- Query invalidation added for watch and tag mutations
- Tag names trimmed before duplicate check
- Thread processing logic updated for correct Redis key usage
v0.1.02026-02-01
Added
- Initial Next.js project setup with App Router and Hono API mount
- Clerk authentication integration with middleware in proxy.ts
- Prisma ORM with PostgreSQL — custom output path for generated client
- Redis-based sliding window rate limiter
- Gmail webhook handling with PubSub push notifications
- Gmail API watch management
- Email tracking model (email_tracked) with user and domain tracking
- Basic subscription management with DodoPayments
- User account deletion flow with watch deactivation
- Content-Security-Policy headers
- Elastic License 2.0
Fixed
- Thread processing logic and duplicate tag prevention
- Message processing with unmarkMessageProcessed function
Security
- Authorization header validation for webhook endpoints
- Environment variable configuration for all secrets
- Content-Security-Policy for neatmail.app domain
// what's next
Follow the public roadmap.
See what we're building next and join the conversation on GitHub.
View on GitHub