louislam/uptime-kuma · error · Error

${output}

Error message

${output}

What it means

apprise.js:11-30. Apprise is shelled out as a child process; its stdout is inspected. If the output contains the substring 'ERROR' (case-sensitive) the provider throws the entire stdout as the error message. This catches apprise reporting missing endpoints, bad URLs, or library-level failures.

Source

Thrown at server/notification-providers/apprise.js:29

        const okMsg = "Sent Successfully.";

        const args = ["-vv", "-b", msg, notification.appriseURL];
        if (notification.title) {
            args.push("-t");
            args.push(notification.title);
        }
        const s = await childProcessAsync.spawn("apprise", args, {
            encoding: "utf8",
        });

        const output = s.stdout ? s.stdout.toString() : "ERROR: maybe apprise not found";

        if (output) {
            if (!output.includes("ERROR")) {
                return okMsg;
            }

            throw new Error(output);
        } else {
            return "No output from apprise";
        }
    }
}

module.exports = Apprise;

View on GitHub (pinned to 6b5ea01557)

Solutions

  1. Run `apprise --version` on the host to confirm the binary is installed and on PATH.
  2. Reproduce the send from the shell with `apprise -vv -t test -b test '<your URLs>'` to see the full diagnostic.
  3. Fix/refresh the Apprise URL string in the notification config based on the diagnostic.
  4. Upgrade or pin Apprise to a version whose URL syntax matches the configured targets.

Example fix

# before: apprise URL uses deprecated syntax
# after: correct scheme
# 'tgram://' requires bot token + chat id
tgram://<bot_token>/<chat_id>
Defensive patterns

Strategy: validation

Validate before calling

// Confirm apprise is installed AND the URL parses before sending
const { execSync } = require('child_process');
function appriseReady() {
    try { execSync('apprise --version', { stdio: 'pipe' }); return true; }
    catch { return false; }
}
if (!appriseReady()) throw new Error('apprise binary not on PATH');

Type guard

function isAppriseSuccess(stdout) { return typeof stdout === 'string' && !stdout.includes('ERROR'); }

Try / catch

try { await provider.send(...); }
catch (e) {
    if (/maybe apprise not found/i.test(e.message)) log.error('Install apprise on the Uptime Kuma host');
    else log.warn(`Apprise delivery issue: ${e.message}`);
}

Prevention

When it happens

Trigger: Apprise URL tags malformed (e.g. 'mailto://' without config), target service unreachable, apprise cannot find a configured plugin, or apprise itself prints an ERROR-prefixed diagnostic line.

Common situations: Apprise not installed / not on PATH (the fallback string 'ERROR: maybe apprise not found'), an Apprise URL syntax the installed apprise version no longer accepts, a persistent config token expired for a target (Discord/Telegram/Slack).

Related errors


AI-assisted analysis of louislam/uptime-kuma@6b5ea01557 (2026-08-12). Data as JSON: /api/errors/6d24ab051d73b9a0. Report an issue: GitHub.