diff --git a/packages/desktop-client/src/browser-preload.browser.js b/packages/desktop-client/src/browser-preload.browser.js
index c7e0f0b35be7a23af910c851311dd5724ccf0489..75065ca521db9b8cbf1e6a359252a64626f95e38 100644
--- a/packages/desktop-client/src/browser-preload.browser.js
+++ b/packages/desktop-client/src/browser-preload.browser.js
@@ -51,6 +51,8 @@ global.Actual = {
     window.location.reload();
   },
 
+  restartElectronServer: () => {},
+
   openFileDialog: async ({ filters = [] }) => {
     return new Promise(resolve => {
       let createdElement = false;
diff --git a/packages/desktop-client/src/components/manager/ConfigServer.tsx b/packages/desktop-client/src/components/manager/ConfigServer.tsx
index 66e4543304237d860042df52f5152966ca79c8f7..fcc619321667c3ee0fac284c7f180e2536ef801c 100644
--- a/packages/desktop-client/src/components/manager/ConfigServer.tsx
+++ b/packages/desktop-client/src/components/manager/ConfigServer.tsx
@@ -1,5 +1,5 @@
 // @ts-strict-ignore
-import React, { useState, useEffect } from 'react';
+import React, { useState, useEffect, useCallback } from 'react';
 import { Trans, useTranslation } from 'react-i18next';
 
 import {
@@ -34,8 +34,15 @@ export function ConfigServer() {
   }, [currentUrl]);
   const [loading, setLoading] = useState(false);
   const [error, setError] = useState<string | null>(null);
+
+  const restartElectronServer = useCallback(() => {
+    globalThis.window.Actual.restartElectronServer();
+    setError(null);
+  }, []);
+
   const [_serverSelfSignedCert, setServerSelfSignedCert] = useGlobalPref(
     'serverSelfSignedCert',
+    restartElectronServer,
   );
 
   function getErrorMessage(error: string) {
@@ -101,7 +108,6 @@ export function ConfigServer() {
 
     if (selfSignedCertificateLocation) {
       setServerSelfSignedCert(selfSignedCertificateLocation[0]);
-      globalThis.window.Actual.relaunch(); // relaunch to use the certificate
     }
   }
 
diff --git a/packages/desktop-client/src/hooks/useGlobalPref.ts b/packages/desktop-client/src/hooks/useGlobalPref.ts
index 02d5773ac62d0a4c91e9cbf208cc4053a1cb9341..4f686a2aefff9cad8d1d9ea7ea09f311a3bfc662 100644
--- a/packages/desktop-client/src/hooks/useGlobalPref.ts
+++ b/packages/desktop-client/src/hooks/useGlobalPref.ts
@@ -11,13 +11,21 @@ type SetGlobalPrefAction<K extends keyof GlobalPrefs> = (
 
 export function useGlobalPref<K extends keyof GlobalPrefs>(
   prefName: K,
+  onSaveGlobalPrefs?: () => void,
 ): [GlobalPrefs[K], SetGlobalPrefAction<K>] {
   const dispatch = useDispatch();
   const setGlobalPref = useCallback<SetGlobalPrefAction<K>>(
     value => {
-      dispatch(saveGlobalPrefs({ [prefName]: value } as GlobalPrefs));
+      dispatch(
+        saveGlobalPrefs(
+          {
+            [prefName]: value,
+          } as GlobalPrefs,
+          onSaveGlobalPrefs,
+        ),
+      );
     },
-    [prefName, dispatch],
+    [prefName, dispatch, onSaveGlobalPrefs],
   );
   const globalPref = useSelector(
     (state: State) => state.prefs.global?.[prefName] as GlobalPrefs[K],
diff --git a/packages/desktop-electron/index.ts b/packages/desktop-electron/index.ts
index d5767d200fc341d8f0d93a9f78ee9b08bab0dfb9..dda8cf7741e9a260c6629752a06bad254d7304ff 100644
--- a/packages/desktop-electron/index.ts
+++ b/packages/desktop-electron/index.ts
@@ -297,6 +297,12 @@ ipcMain.on('get-bootstrap-data', event => {
   event.returnValue = payload;
 });
 
+ipcMain.handle('restart-server', () => {
+  serverProcess.kill();
+  serverProcess = null;
+  createBackgroundProcess();
+});
+
 ipcMain.handle('relaunch', () => {
   app.relaunch();
   app.exit();
diff --git a/packages/desktop-electron/preload.ts b/packages/desktop-electron/preload.ts
index 832bd6a505bfc75dd34c4793be949ad8cdde15e5..7ede4442910bf7ad59ad2b2c35a0d7a332099cb2 100644
--- a/packages/desktop-electron/preload.ts
+++ b/packages/desktop-electron/preload.ts
@@ -34,6 +34,10 @@ contextBridge.exposeInMainWorld('Actual', {
     ipcRenderer.invoke('relaunch');
   },
 
+  restartElectronServer: () => {
+    ipcRenderer.invoke('restart-server');
+  },
+
   openFileDialog: (opts: OpenFileDialogPayload) => {
     return ipcRenderer.invoke('open-file-dialog', opts);
   },
diff --git a/packages/loot-core/src/client/actions/prefs.ts b/packages/loot-core/src/client/actions/prefs.ts
index 5dbca103f50908b1787b2da89deb92ac5330e2c2..76b9272d62f0d8a4a60fb08da2f010603f5b6c7f 100644
--- a/packages/loot-core/src/client/actions/prefs.ts
+++ b/packages/loot-core/src/client/actions/prefs.ts
@@ -48,12 +48,16 @@ export function loadGlobalPrefs() {
   };
 }
 
-export function saveGlobalPrefs(prefs: prefs.GlobalPrefs) {
+export function saveGlobalPrefs(
+  prefs: prefs.GlobalPrefs,
+  onSaveGlobalPrefs?: () => void,
+) {
   return async (dispatch: Dispatch) => {
     await send('save-global-prefs', prefs);
     dispatch({
       type: constants.MERGE_GLOBAL_PREFS,
       globalPrefs: prefs,
     });
+    onSaveGlobalPrefs?.();
   };
 }
diff --git a/packages/loot-core/src/platform/server/fetch/index.electron.ts b/packages/loot-core/src/platform/server/fetch/index.electron.ts
index 63ba01462afd7428d4d1a814e72496a264d1e82d..05a320bc0fe38371cd528a2eea6ca79bdaa586f0 100644
--- a/packages/loot-core/src/platform/server/fetch/index.electron.ts
+++ b/packages/loot-core/src/platform/server/fetch/index.electron.ts
@@ -1,12 +1,20 @@
 // @ts-strict-ignore
 import nodeFetch from 'node-fetch';
 
-export const fetch = (input: RequestInfo | URL, options?: RequestInit) => {
-  return nodeFetch(input, {
-    ...options,
-    headers: {
-      ...options?.headers,
-      origin: 'app://actual',
-    },
-  });
+export const fetch = async (
+  input: RequestInfo | URL,
+  options?: RequestInit,
+) => {
+  try {
+    return await nodeFetch(input, {
+      ...options,
+      headers: {
+        ...options?.headers,
+        origin: 'app://actual',
+      },
+    });
+  } catch (error) {
+    console.error(error); // log error
+    throw error;
+  }
 };
diff --git a/packages/loot-core/typings/window.d.ts b/packages/loot-core/typings/window.d.ts
index 7f9173c6ae7e76a99a8478d1839f286a8bd257c5..870114cb64bf6e620900bf009bfa81740eb645ab 100644
--- a/packages/loot-core/typings/window.d.ts
+++ b/packages/loot-core/typings/window.d.ts
@@ -15,6 +15,7 @@ declare global {
         opts: Parameters<import('electron').Dialog['showOpenDialogSync']>[0],
       ) => Promise<string[]>;
       relaunch: () => void;
+      restartElectronServer: () => void;
     };
 
     __navigate?: import('react-router').NavigateFunction;
diff --git a/upcoming-release-notes/3431.md b/upcoming-release-notes/3431.md
new file mode 100644
index 0000000000000000000000000000000000000000..a323e31a3c3ba623619af64c6b43025d0e0a3164
--- /dev/null
+++ b/upcoming-release-notes/3431.md
@@ -0,0 +1,6 @@
+---
+category: Maintenance
+authors: [MikesGlitch]
+---
+
+Restart server silently when adding self signed cert and add some logs