function start() {
    return i18n.registerMessageCatalog("runtime",path.resolve(path.join(__dirname,"..","locales")),"runtime.json")
        .then(function() { return storage.init(runtime)})
        .then(function() { return settings.load(storage)})
        .then(function() { return library.init(runtime)})
        .then(function() { return multiplayer.init(runtime)})
        .then(function() {
            if (settings.available()) {
                if (settings.get('instanceId') === undefined) {
                    settings.set('instanceId', crypto.randomBytes(8).toString('hex'))
                }
                userSettings.instanceId = settings.get('instanceId') || ''
            }
            if (log.metric()) {
                runtimeMetricInterval = setInterval(function() {
                    reportMetrics();
                }, settings.runtimeMetricInterval||15000);
            }
            log.info("\n\n"+log._("runtime.welcome")+"\n===================\n");
            if (settings.version) {
                log.info(log._("runtime.version",{component:"Node-RED",version:"v"+settings.version}));
            }
            log.info(log._("runtime.version",{component:"Node.js ",version:process.version}));
            if (settings.UNSUPPORTED_VERSION) {
                log.error("*****************************************************************");
                log.error("* "+log._("runtime.unsupported_version",{component:"Node.js",version:process.version,requires: ">=18"})+" *");
                log.error("*****************************************************************");
                events.emit("runtime-event",{id:"runtime-unsupported-version",payload:{type:"error",text:"notification.errors.unsupportedVersion"},retain:true});
            }
            log.info(os.type()+" "+os.release()+" "+os.arch()+" "+os.endianness());
            return redNodes.load().then(function() {
                let autoInstallModules = false;
                if (settings.hasOwnProperty('autoInstallModules')) {
                    log.warn(log._("server.deprecatedOption",{old:"autoInstallModules", new:"externalModules.autoInstall"}));
                    autoInstallModules = true;
                }
                if (settings.externalModules) {
                    // autoInstallModules = autoInstall enabled && (no palette setting || palette install not disabled)
                    autoInstallModules = settings.externalModules.autoInstall && (!settings.externalModules.palette || settings.externalModules.palette.allowInstall !== false) ;
                }
                var i;
                var nodeErrors = redNodes.getNodeList(function(n) { return n.err!=null;});
                var nodeMissing = redNodes.getNodeList(function(n) { return n.module && n.enabled && !n.loaded && !n.err;});
                if (nodeErrors.length > 0) {
                    log.warn("------------------------------------------------------");
                    for (i=0;i<nodeErrors.length;i+=1) {
                        if (nodeErrors[i].err.code === "type_already_registered") {
                            log.warn("["+nodeErrors[i].id+"] "+log._("server.type-already-registered",{type:nodeErrors[i].err.details.type,module: nodeErrors[i].err.details.moduleA}));
                        } else if (nodeErrors[i].err.code === "set_has_no_types") {
                            log.warn("["+nodeErrors[i].id+"] "+log._("server.set-has-no-types", nodeErrors[i].err.details));
                        } else {
                            log.warn("["+nodeErrors[i].id+"] "+nodeErrors[i].err);
                        }
                    }
                    log.warn("------------------------------------------------------");
                }
                if (nodeMissing.length > 0) {
                    log.warn(log._("server.missing-modules"));
                    var missingModules = {};
                    for (i=0;i<nodeMissing.length;i++) {
                        var missing = nodeMissing[i];
                        missingModules[missing.module] = missingModules[missing.module]||{
                            module:missing.module,
                            version:missing.pending_version||missing.version,
                            types:[]
                        }
                        missingModules[missing.module].types = missingModules[missing.module].types.concat(missing.types);
                    }
                    var moduleList = [];
                    var promises = [];
                    var installingModules = [];
                    for (i in missingModules) {
                        if (missingModules.hasOwnProperty(i)) {
                            log.warn(" - "+i+" ("+missingModules[i].version+"): "+missingModules[i].types.join(", "));
                            if (autoInstallModules && i != "node-red") {
                                installingModules.push({id:i,version:missingModules[i].version});
                            }
                        }
                    }
                    if (!autoInstallModules) {
                        log.info(log._("server.removing-modules"));
                        redNodes.cleanModuleList();
                    } else if (installingModules.length > 0) {
                        reinstallAttempts = 0;
                        reinstallModules(installingModules);
                    }
                }
                if (settings.settingsFile) {
                    log.info(log._("runtime.paths.settings",{path:settings.settingsFile}));
                }
                if (settings.httpRoot !== undefined) {
                    log.warn(log._("server.deprecatedOption",{old:"httpRoot", new: "httpNodeRoot/httpAdminRoot"}));
                }
                if (settings.readOnly){
                    log.info(log._("settings.readonly-mode"))
                }
                if (settings.httpStatic && settings.httpStatic.length) {
                    for (let si = 0; si < settings.httpStatic.length; si++) {
                        let p = path.resolve(settings.httpStatic[si].path);
                        let r = settings.httpStatic[si].root || "/";
                        log.info(log._("runtime.paths.httpStatic",{path:`${p} > ${r}`}));
                    }
                }
                return redNodes.loadContextsPlugin().then(function () {
                    redNodes.loadFlows().then(() => { redNodes.startFlows() }).catch(function(err) {});
                    started = true;
                });
            });
        });
}
Start the runtime.
@return {Promise} - resolves when the runtime is started. This does not mean the
  flows will be running as they are started asynchronously.
@memberof @node-red/runtime