diff --git a/db-version.patch b/db-version.patch
index ba028f6..8eef6ef 100644
--- a/db-version.patch
+++ b/db-version.patch
@@ -17,7 +17,7 @@ index a346146..b4ef320 100644
XIVPlan is a tool for quickly diagramming raid strategies for Final Fantasy XIV, inspired by{' '}
RaidPlan.io and{' '}
diff --git a/src/App.tsx b/src/App.tsx
-index f3f05eb..fd4daf9 100644
+index 05a2fb7..f7ed022 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -8,6 +8,7 @@ import { FileOpenPage } from './FileOpenPage';
@@ -58,7 +58,7 @@ index de674da..8de51f1 100644
}
if (isDirty) {
diff --git a/src/MainToolbar.tsx b/src/MainToolbar.tsx
-index a98a937..b4e9ff0 100644
+index e876909..abd73f1 100644
--- a/src/MainToolbar.tsx
+++ b/src/MainToolbar.tsx
@@ -131,7 +131,8 @@ const SaveButton: React.FC = () => {
@@ -72,7 +72,7 @@ index a98a937..b4e9ff0 100644
}
};
diff --git a/src/SceneProvider.tsx b/src/SceneProvider.tsx
-index c6641d3..a809e24 100644
+index e2565bb..e483e67 100644
--- a/src/SceneProvider.tsx
+++ b/src/SceneProvider.tsx
@@ -170,7 +170,16 @@ export interface BlobFileSource {
@@ -94,7 +94,7 @@ index c6641d3..a809e24 100644
export interface EditorState {
scene: Scene;
diff --git a/src/SiteHeader.tsx b/src/SiteHeader.tsx
-index 79c8d56..80037fb 100644
+index 524a0d3..8642bd4 100644
--- a/src/SiteHeader.tsx
+++ b/src/SiteHeader.tsx
@@ -75,7 +75,7 @@ export const SiteHeader: React.FC> = ({ className, .
@@ -119,18 +119,18 @@ index 79c8d56..80037fb 100644
diff --git a/src/file.ts b/src/file.ts
-index 0adbbdc..9f74a6a 100644
+index bcc4a94..1a0453c 100644
--- a/src/file.ts
+++ b/src/file.ts
@@ -3,12 +3,13 @@ import { deflate, inflate } from 'pako';
- import { FileSource } from './SceneProvider';
+ import type { FileSource } from './SceneProvider';
import { downloadScene, openFileBlob } from './file/blob';
+import { authUser, getPlans, openFromDB, saveNewToDB, saveToDB } from './file/db';
import { openFileFs, saveFileFs } from './file/filesystem';
import { openFileLocalStorage, saveFileLocalStorage } from './file/localStorage';
import { upgradeScene } from './file/upgrade';
- import { Scene } from './scene';
+ import type { Scene } from './scene';
-export async function saveFile(scene: Readonly, source: FileSource): Promise {
+export async function saveFile(scene: Readonly, source: FileSource): Promise {
@@ -190,7 +190,7 @@ index 0adbbdc..9f74a6a 100644
}
diff --git a/src/file/FileDialog.tsx b/src/file/FileDialog.tsx
-index 0d52b22..c4c98b7 100644
+index 63a473b..d32cb53 100644
--- a/src/file/FileDialog.tsx
+++ b/src/file/FileDialog.tsx
@@ -14,18 +14,20 @@ import React, { useState } from 'react';
@@ -257,17 +257,17 @@ index 0d52b22..c4c98b7 100644
diff --git a/src/file/ShareDialogButton.tsx b/src/file/ShareDialogButton.tsx
-index fdac7a1..853e07c 100644
+index d9cd04a..706f3bb 100644
--- a/src/file/ShareDialogButton.tsx
+++ b/src/file/ShareDialogButton.tsx
@@ -17,7 +17,7 @@ import { CopyRegular, ShareRegular } from '@fluentui/react-icons';
- import React, { ReactNode } from 'react';
+ import React, { type ReactNode } from 'react';
import { CollapsableToolbarButton } from '../CollapsableToolbarButton';
import { HotkeyBlockingDialogBody } from '../HotkeyBlockingDialogBody';
-import { useScene } from '../SceneProvider';
-+import { FileSource, useScene } from '../SceneProvider';
++import { type FileSource, useScene } from '../SceneProvider';
import { sceneToText } from '../file';
- import { Scene } from '../scene';
+ import type { Scene } from '../scene';
import { DownloadButton } from './DownloadButton';
@@ -42,9 +42,9 @@ export const ShareDialogButton: React.FC = ({ children }
@@ -298,7 +298,7 @@ index fdac7a1..853e07c 100644
const useStyles = makeStyles({
diff --git a/vite.config.ts b/vite.config.ts
-index eb719f3..8263ebe 100644
+index f44ac40..e6c7bb3 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -22,6 +22,14 @@ function getEnvOptions(mode: string): UserConfig {