diff --git a/electron.js b/electron.js
index f32f992ab..68aad6391 100644
--- a/electron.js
+++ b/electron.js
@@ -5,6 +5,7 @@ const sqlInit = require('./src/services/sql_init');
 const appIconService = require('./src/services/app_icon');
 const windowService = require('./src/services/window');
 const tray = require('./src/services/tray');
+const beccaLoader = require("./src/becca/becca_loader");
 
 // Adds debug features like hotkeys for triggering dev tools and reload
 require('electron-debug')();
@@ -28,14 +29,17 @@ app.on('ready', async () => {
     // if db is not initialized -> setup process
     // if db is initialized, then we need to wait until the migration process is finished
     if (sqlInit.isDbInitialized()) {
-        await sqlInit.dbReady;
+        // first let electron open the window, it will probably keep initializing for some time in async
+        windowService.createMainWindow(app);
 
-        await windowService.createMainWindow(app);
+        // then becca load will block the backend process for a while
+        await sqlInit.dbReady;
+        beccaLoader.loadInitially();
 
         if (process.platform === 'darwin') {
             app.on('activate', async () => {
                 if (BrowserWindow.getAllWindows().length === 0) {
-                    await windowService.createMainWindow(app);
+                    windowService.createMainWindow(app);
                 }
             });
         }
diff --git a/package.json b/package.json
index d0c307ae1..e476d4d8c 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,7 @@
   },
   "scripts": {
     "start-server": "cross-env TRILIUM_DATA_DIR=./data TRILIUM_ENV=dev node ./src/www",
-    "start-electron": "cross-env TRILIUM_DATA_DIR=./data TRILIUM_ENV=dev electron --inspect=5858 .",
+    "start-electron": "cross-env TRILIUM_DATA_DIR=./data TRILIUM_ENV=dev electron --trace-warnings --inspect=5858 .",
     "switch-server": "rm -r ./node_modules/better-sqlite3 && npm install",
     "switch-electron": "rm -r ./node_modules/better-sqlite3 && npm install && ./node_modules/.bin/electron-rebuild",
     "build-backend-docs": "rm -r ./docs/backend_api && ./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/backend_api src/becca/entities/*.js src/services/backend_script_api.js src/services/sql.js",
diff --git a/src/becca/becca_loader.js b/src/becca/becca_loader.js
index e21eeefe1..64a1377cf 100644
--- a/src/becca/becca_loader.js
+++ b/src/becca/becca_loader.js
@@ -13,16 +13,20 @@ const EtapiToken = require("./entities/etapi_token");
 const cls = require("../services/cls");
 const entityConstructor = require("../becca/entity_constructor");
 
+let setBeccaAsLoaded = null;
+
 const beccaLoaded = new Promise((res, rej) => {
-    sqlInit.dbReady.then(() => {
-        load();
-
-        cls.init(() => require('../services/options_init').initStartupOptions());
-
-        res();
-    });
+    setBeccaAsLoaded = res;
 });
 
+function loadInitially() {
+    load();
+
+    cls.init(() => require('../services/options_init').initStartupOptions());
+
+    setBeccaAsLoaded();
+}
+
 function load() {
     const start = Date.now();
     becca.reset();
@@ -245,5 +249,6 @@ eventService.subscribeBeccaLoader(eventService.LEAVE_PROTECTED_SESSION, load);
 module.exports = {
     load,
     reload,
-    beccaLoaded
+    beccaLoaded,
+    loadInitially
 };
diff --git a/src/becca/becca_service.js b/src/becca/becca_service.js
index f2cebbaae..954480ce0 100644
--- a/src/becca/becca_service.js
+++ b/src/becca/becca_service.js
@@ -1,8 +1,7 @@
 "use strict";
 
-const becca = require('./becca.js');
+const becca = require('./becca');
 const cls = require('../services/cls');
-const protectedSessionService = require('../services/protected_session');
 const log = require('../services/log');
 
 function isNotePathArchived(notePath) {
diff --git a/src/services/scheduler.js b/src/services/scheduler.js
index 20b964802..3c5cd5bbb 100644
--- a/src/services/scheduler.js
+++ b/src/services/scheduler.js
@@ -1,12 +1,12 @@
 const scriptService = require('./script');
 const cls = require('./cls');
-const sqlInit = require('./sql_init');
 const config = require('./config');
 const log = require('./log');
 const sql = require("./sql");
 const becca = require("../becca/becca");
 const specialNotesService = require("../services/special_notes");
 const protectedSessionService = require("../services/protected_session");
+const beccaLoader = require("../becca/becca_loader");
 
 function getRunAtHours(note) {
     try {
@@ -50,7 +50,7 @@ function runNotesWithLabel(runAttrValue) {
     }
 }
 
-sqlInit.dbReady.then(() => {
+beccaLoader.beccaLoaded.then(() => {
     if (!process.env.TRILIUM_SAFE_MODE) {
         cls.init(() => specialNotesService.createMissingSpecialNotes());
 
diff --git a/src/services/search/services/search.js b/src/services/search/services/search.js
index 42897ebc5..bc469e8c7 100644
--- a/src/services/search/services/search.js
+++ b/src/services/search/services/search.js
@@ -10,7 +10,6 @@ const becca = require('../../../becca/becca');
 const beccaService = require('../../../becca/becca_service');
 const utils = require('../../utils');
 const log = require('../../log');
-const scriptService = require("../../script.js");
 
 function searchFromNote(note) {
     let searchResultNoteIds, highlightedTokens;
@@ -69,6 +68,7 @@ function searchFromRelation(note, relationName) {
         return [];
     }
 
+    const scriptService = require("../../script");
     const result = scriptService.executeNote(scriptNote, { originEntity: note });
 
     if (!Array.isArray(result)) {
diff --git a/src/services/window.js b/src/services/window.js
index 6ccf16a5d..593bab020 100644
--- a/src/services/window.js
+++ b/src/services/window.js
@@ -44,11 +44,11 @@ ipcMain.on('create-extra-window', (event, arg) => {
     createExtraWindow(arg.notePath, arg.hoistedNoteId);
 });
 
-async function createMainWindow(app) {
+function createMainWindow(app) {
     const windowStateKeeper = require('electron-window-state'); // should not be statically imported
 
     const mainWindowState = windowStateKeeper({
-        // default window width & height so it's usable on 1600 * 900 display (including some extra panels etc.)
+        // default window width & height, so it's usable on 1600 * 900 display (including some extra panels etc.)
         defaultWidth: 1200,
         defaultHeight: 800
     });
diff --git a/src/www b/src/www
index 4652c785c..965173e6d 100644
--- a/src/www
+++ b/src/www
@@ -25,10 +25,10 @@ const log = require('./services/log');
 const appInfo = require('./services/app_info');
 const ws = require('./services/ws');
 const utils = require('./services/utils');
-const sqlInit = require('./services/sql_init');
 const port = require('./services/port');
 const host = require('./services/host');
 const semver = require('semver');
+const beccaLoader = require("./becca/becca_loader");
 
 if (!semver.satisfies(process.version, ">=10.5.0")) {
     console.error("Trilium only supports node.js 10.5 and later");
@@ -95,6 +95,10 @@ async function startTrilium() {
     const cpuInfos = require('os').cpus();
     log.info(`CPU model: ${cpuInfos[0].model}, logical cores: ${cpuInfos.length} freq: ${cpuInfos[0].speed} Mhz`); // for perf. issues it's good to know the rough configuration
 
+    if (!utils.isElectron()) {
+        beccaLoader.loadInitially();
+    }
+
     /**
      * Listen on provided port, on all network interfaces.
      */