diff --git a/apps/client-standalone/package.json b/apps/client-standalone/package.json
new file mode 100644
index 000000000..55befe360
--- /dev/null
+++ b/apps/client-standalone/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@triliumnext/client-standalone",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ }
+}
diff --git a/apps/client-standalone/src/index.html b/apps/client-standalone/src/index.html
new file mode 100644
index 000000000..81ef3b387
--- /dev/null
+++ b/apps/client-standalone/src/index.html
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+ Trilium Notes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/client-standalone/vite.config.mts b/apps/client-standalone/vite.config.mts
new file mode 100644
index 000000000..5adb36648
--- /dev/null
+++ b/apps/client-standalone/vite.config.mts
@@ -0,0 +1,33 @@
+import { defineConfig } from 'vite';
+import { join } from 'path';
+import { viteStaticCopy } from 'vite-plugin-static-copy';
+
+const assets = ["assets", "stylesheets", "fonts", "translations"];
+
+export default defineConfig(() => ({
+ root: __dirname,
+ base: "",
+ plugins: [
+ viteStaticCopy({
+ targets: assets.map((asset) => ({
+ src: `../${asset}/*`,
+ dest: asset
+ }))
+ })
+ ],
+ server: {
+ watch: {
+ ignored: ['!**/node_modules/@triliumnext/**']
+ }
+ },
+ build: {
+ target: "esnext",
+ outDir: join(__dirname, 'dist'),
+ emptyOutDir: true,
+ rollupOptions: {
+ input: {
+ main: join(__dirname, 'src', 'index.html')
+ }
+ }
+ }
+}));
\ No newline at end of file