Fluxmail
Upgrade guides

Upgrade to 0.9.0

Prepare stored data and custom email providers for Fluxmail 0.9.0.

Fluxmail 0.9.0 adds send-as addresses and multi-account search. Existing installations advance to store format 3, and custom providers must report when a search has examined its full scope.

Find your migration

Only follow the rows for the surfaces you use.

SurfaceRequired changes
Stored dataStop every Fluxmail process that shares the data directory, back up the directory, and keep the migration backup if you may need to roll back.
Custom providersReturn MessageSearchPage from EmailProvider.listMessages() and set its required exhausted field.
MCP, CLI, and REST clientsNo migration is required. Search responses now include exhausted, and existing 0.8.1 page tokens remain valid until their normal one-hour expiry.
Built-in Gmail, Outlook, and IMAP providersNo provider code change is required.

Prepare stored data

Stop every Fluxmail process that uses the data directory. Back up the complete directory, including the SQLite database and encryption.key, before installing 0.9.0.

The first 0.9.0 process to open the database creates the send-as table and advances the store from format 2 to format 3. Fluxmail also writes a database backup to the backups directory before the migration. The migration keeps existing accounts, credentials, messages, members, configuration, and license data.

Fluxmail 0.8.x cannot open a format 3 store. To roll back, stop Fluxmail and restore the complete data-directory backup. Do not open the migrated database with an older release.

Update custom providers

EmailProvider.listMessages() now returns MessageSearchPage instead of Page<Message>. Every result must include exhausted:

import type { EmailQuery, MessageSearchPage, PageOpts } from '@fluxmail/core';

async function listMessages(query: EmailQuery, page?: PageOpts): Promise<MessageSearchPage> {
  const result = await searchMailbox(query, page);
  const response = {
    items: result.items,
    ...(result.nextPageToken ? { nextPageToken: result.nextPageToken } : {}),
  };

  if (result.providerLimited) {
    return {
      ...response,
      exhausted: false,
      incomplete: true,
      incompleteReason: 'provider_limit',
    };
  }

  return {
    ...response,
    exhausted: result.fullScopeExamined,
  };
}

Set exhausted from whether the provider examined the full requested scope, not from whether it returned a continuation token. Return false when a continuation token exists or when a provider limit prevents a complete search. A capped result must remain false even when the provider does not return a token.

PageOpts also has optional includeSnippet, signal, and softDeadlineAt fields. A custom provider can ignore includeSnippet when it has no preview support. Honor the abort signal and soft deadline when possible so searches stop promptly and return a continuation at a safe boundary.

The optional EmailProvider.listSendAs() method does not require a custom provider change. Implement it only when the provider can discover send-as identities.

Check search clients

MCP, CLI, and REST request fields remain compatible. Search pages now include exhausted, which is true only when Fluxmail has examined the full requested scope. Clients that validate response objects against a closed schema should allow this field.

Existing 0.8.1 search page tokens remain valid with the same account, query, page size, instance encryption key, and snippet setting. New tokens still expire after one hour.

Last updated