actualbudget/actual · error

No sync server configured.

Error message

No sync server configured.

What it means

bootstrap calls getServer() to find the configured sync server; if no server URL is configured (SERVER_URL unset), there is no endpoint to POST /bootstrap to, so it throws immediately.

Source

Thrown at packages/loot-core/src/server/auth/app.ts:103

  return {
    bootstrapped: res.data.bootstrapped,
    availableLoginMethods: res.data.availableLoginMethods || [
      { method: 'password', active: true, displayName: 'Password' },
    ],
    multiuser: res.data.multiuser || false,
    hasServer: true,
  };
}

async function bootstrap(loginConfig: {
  password?: string;
  openId?: OpenIdConfig;
}) {
  try {
    const serverConfig = getServer();
    if (!serverConfig) {
      throw new Error('No sync server configured.');
    }
    await post(serverConfig.SIGNUP_SERVER + '/bootstrap', loginConfig);
  } catch (err) {
    if (err instanceof PostError) {
      return {
        error: err.reason || 'network-failure',
      };
    }

    throw err;
  }
  return {};
}

async function getLoginMethods() {
  let res: {
    methods?: Array<{ method: string; displayName: string; active: boolean }>;
  };

View on GitHub (pinned to d4334cb6e6)

Solutions

  1. Set the SERVER_URL environment variable to the sync server's base URL before calling bootstrap.
  2. If you do not use a sync server, do not call bootstrap — configure the app in local-only mode.
  3. Verify getServer() configuration loading (dotenv/config file) is actually applied in your process.

Example fix

// before
yarn workspace @actual-app/sync-server start   # SERVER_URL unset, bootstrap fails
// after
SERVER_URL=http://localhost:5006 yarn workspace @actual-app/sync-server start
Defensive patterns

Strategy: try-catch

Validate before calling

function isSyncConfigured() {
  return typeof process.env.SERVER_URL === 'string' && process.env.SERVER_URL.length > 0;
}
if (!isSyncConfigured()) throw new Error('Set SERVER_URL before bootstrapping a sync server');

Try / catch

try {
  await app.bootstrap(loginConfig);
} catch (e) {
  if (e.message === 'No sync server configured.') {
    console.error('SERVER_URL is not set; start the app in local-only mode or configure the sync server.');
  } else throw e;
}

Prevention

When it happens

Trigger: Calling app.bootstrap() (server bootstrapping of first user/password) in an environment without SERVER_URL set, e.g. a pure local-only deployment.

Common situations: Self-hosters running without a sync server who invoke the bootstrap RPC; missing or empty SERVER_URL env var in the sync-server deployment; confusing local budget bootstrapping with remote server bootstrapping.

Related errors


AI-assisted analysis of actualbudget/actual@d4334cb6e6 (2026-08-29). Data as JSON: /api/errors/50129d90735bf2bd. Report an issue: GitHub.