diff --git a/packages/desktop-electron/index.ts b/packages/desktop-electron/index.ts
index bb75cbf6916efa812cd16c51b4fdf4bfae9c200b..049e79c35bad9e535d0e8d94bc8fa0693c179a0d 100644
--- a/packages/desktop-electron/index.ts
+++ b/packages/desktop-electron/index.ts
@@ -9,6 +9,7 @@ import {
   Menu,
   dialog,
   shell,
+  powerMonitor,
   protocol,
   utilityProcess,
   UtilityProcess,
@@ -241,7 +242,7 @@ app.on('ready', async () => {
 
   // This is mainly to aid debugging Sentry errors - it will add a
   // breadcrumb
-  require('electron').powerMonitor.on('suspend', () => {
+  powerMonitor.on('suspend', () => {
     console.log('Suspending', new Date());
   });
 
diff --git a/packages/desktop-electron/modules.d.ts b/packages/desktop-electron/modules.d.ts
index 509b52346bd8cd834bfa300406d65bf8fbbbeaa8..7341f7749b4c0c23c7f39a6cf0e0882702b84305 100644
--- a/packages/desktop-electron/modules.d.ts
+++ b/packages/desktop-electron/modules.d.ts
@@ -5,4 +5,5 @@ declare module 'module' {
 // bundles not available until we build them
 declare module 'loot-core/lib-dist/bundle.desktop.js' {
   const initApp: (isDev: boolean) => void;
+  const lib: { getDataDir: () => string };
 }
diff --git a/packages/desktop-electron/window-state.js b/packages/desktop-electron/window-state.ts
similarity index 67%
rename from packages/desktop-electron/window-state.js
rename to packages/desktop-electron/window-state.ts
index 205c8816217a60b001fed269183440edb166d631..46b1a077129b426409a575fd426cd15db33a94ad 100644
--- a/packages/desktop-electron/window-state.js
+++ b/packages/desktop-electron/window-state.ts
@@ -1,13 +1,22 @@
-const fs = require('fs');
-const path = require('path');
+import fs from 'fs';
+import path from 'path';
 
-const electron = require('electron');
+import electron, { BrowserWindow } from 'electron';
 
-// eslint-disable-next-line import/extensions
-const backend = require('loot-core/lib-dist/bundle.desktop.js');
+const backend = undefined;
+const getBackend = async () =>
+  // eslint-disable-next-line import/extensions
+  backend || (await import('loot-core/lib-dist/bundle.desktop.js'));
 
-function loadState() {
-  let state = {};
+type WindowState = Electron.Rectangle & {
+  isMaximized?: boolean;
+  isFullScreen?: boolean;
+  displayBounds?: Electron.Rectangle;
+};
+
+async function loadState() {
+  let state: WindowState | undefined = undefined;
+  const backend = await getBackend();
   try {
     state = JSON.parse(
       fs.readFileSync(
@@ -18,24 +27,27 @@ function loadState() {
   } catch (e) {
     console.log('Could not load window state');
   }
+
   return validateState(state);
 }
 
-function updateState(win, state) {
-  const screen = electron.screen || electron.remote.screen;
+function updateState(win: BrowserWindow, state: WindowState) {
+  const screen = electron.screen;
   const bounds = win.getBounds();
   if (!win.isMaximized() && !win.isMinimized() && !win.isFullScreen()) {
-    state.x = bounds.x;
-    state.y = bounds.y;
     state.width = bounds.width;
     state.height = bounds.height;
   }
+
+  state.x = bounds.x;
+  state.y = bounds.y;
   state.isMaximized = win.isMaximized();
   state.isFullScreen = win.isFullScreen();
   state.displayBounds = screen.getDisplayMatching(bounds).bounds;
 }
 
-function saveState(win, state) {
+async function saveState(win: BrowserWindow, state: WindowState) {
+  const backend = await getBackend();
   updateState(win, state);
   fs.writeFileSync(
     path.join(backend.lib.getDataDir(), 'window.json'),
@@ -44,7 +56,7 @@ function saveState(win, state) {
   );
 }
 
-function listen(win, state) {
+export function listen(win: BrowserWindow, state: WindowState) {
   if (state.isMaximized) {
     win.maximize();
   }
@@ -61,7 +73,7 @@ function listen(win, state) {
   };
 }
 
-function hasBounds(state) {
+function hasBounds(state: WindowState) {
   return (
     Number.isInteger(state.x) &&
     Number.isInteger(state.y) &&
@@ -72,15 +84,18 @@ function hasBounds(state) {
   );
 }
 
-function validateState(state) {
-  if (!(hasBounds(state) || state.isMaximized || state.isFullScreen)) {
+function validateState(state?: WindowState): Partial<WindowState> {
+  if (
+    !state ||
+    !(hasBounds(state) || state.isMaximized || state.isFullScreen)
+  ) {
     return {};
   }
 
   const newState = Object.assign({}, state);
 
   if (hasBounds(state) && state.displayBounds) {
-    const screen = electron.screen || electron.remote.screen;
+    const screen = electron.screen;
 
     // Check if the display where the window was last open is still available
     const displayBounds = screen.getDisplayMatching(state).bounds;
@@ -116,22 +131,19 @@ function validateState(state) {
   return newState;
 }
 
-async function get() {
-  const screen = electron.screen || electron.remote.screen;
+export async function get() {
+  const screen = electron.screen;
   const displayBounds = screen.getPrimaryDisplay().bounds;
 
-  let state = loadState();
-  state = Object.assign(
+  const state: WindowState = Object.assign(
     {
       x: 100,
       y: 50,
       width: Math.min(1000, displayBounds.width - 100),
       height: Math.min(700, displayBounds.width - 50),
     },
-    state,
+    await loadState(),
   );
 
   return state;
 }
-
-module.exports = { get, listen };
diff --git a/upcoming-release-notes/3027.md b/upcoming-release-notes/3027.md
new file mode 100644
index 0000000000000000000000000000000000000000..c32c14123130668f3ebf045f66e356a0255379d9
--- /dev/null
+++ b/upcoming-release-notes/3027.md
@@ -0,0 +1,6 @@
+---
+category: Maintenance
+authors: [MikesGlitch]
+---
+
+Updated Electron window-state file to use typescript