summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-05-22 16:19:35 +0900
committerAdam Malczewski <[email protected]>2026-05-22 16:19:35 +0900
commit45a4890031192f4e7409443f98e824dad17ba175 (patch)
treea28e1b0618f682476b0b57ba70e8ba26a1939a49 /packages
parent9ecaabd87c0e51b8a7408dabb0133a9344586859 (diff)
downloaddispatch-45a4890031192f4e7409443f98e824dad17ba175.tar.gz
dispatch-45a4890031192f4e7409443f98e824dad17ba175.zip
feat: Arch Linux packaging with Electron frontend, systemd backend service, and Windows exe build
- Add Electron wrapper (main.cjs, preload.cjs) for desktop frontend - Add systemd service unit, env config, and sysusers for backend API - Add PKGBUILD and .install for Arch package (makepkg -si) - Add desktop entry, SVG/PNG icon, and wrapper scripts - Add bin/build-pkg, bin/install-pkg, bin/windows-pkg scripts - Make API port configurable via PORT env var (default 3000, prod 18390) - Add electron-builder config for Windows exe cross-compilation - Set vite base to './' for Electron file:// loading
Diffstat (limited to 'packages')
-rw-r--r--packages/api/src/index.ts2
-rw-r--r--packages/frontend/electron/main.cjs33
-rw-r--r--packages/frontend/electron/preload.cjs7
-rw-r--r--packages/frontend/package.json23
-rw-r--r--packages/frontend/vite.config.ts1
5 files changed, 64 insertions, 2 deletions
diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts
index 045196b..b188e39 100644
--- a/packages/api/src/index.ts
+++ b/packages/api/src/index.ts
@@ -71,7 +71,7 @@ app.get(
export { app };
export default {
- port: 3000,
+ port: Number(process.env.PORT) || 3000,
fetch: app.fetch,
websocket,
};
diff --git a/packages/frontend/electron/main.cjs b/packages/frontend/electron/main.cjs
new file mode 100644
index 0000000..2d947da
--- /dev/null
+++ b/packages/frontend/electron/main.cjs
@@ -0,0 +1,33 @@
+const { app, BrowserWindow } = require('electron');
+const path = require('path');
+
+function createWindow() {
+ const win = new BrowserWindow({
+ width: 1280,
+ height: 800,
+ title: 'Dispatch',
+ webPreferences: {
+ nodeIntegration: false,
+ contextIsolation: true,
+ preload: path.join(__dirname, 'preload.cjs'),
+ },
+ });
+
+ win.loadFile(path.join(__dirname, '../dist/index.html'));
+}
+
+app.whenReady().then(() => {
+ createWindow();
+
+ app.on('activate', () => {
+ if (BrowserWindow.getAllWindows().length === 0) {
+ createWindow();
+ }
+ });
+});
+
+app.on('window-all-closed', () => {
+ if (process.platform !== 'darwin') {
+ app.quit();
+ }
+});
diff --git a/packages/frontend/electron/preload.cjs b/packages/frontend/electron/preload.cjs
new file mode 100644
index 0000000..c254892
--- /dev/null
+++ b/packages/frontend/electron/preload.cjs
@@ -0,0 +1,7 @@
+const { contextBridge } = require('electron');
+
+contextBridge.exposeInMainWorld('versions', {
+ electron: process.versions.electron,
+ node: process.versions.node,
+ chrome: process.versions.chrome,
+});
diff --git a/packages/frontend/package.json b/packages/frontend/package.json
index 37b794d..5228e4a 100644
--- a/packages/frontend/package.json
+++ b/packages/frontend/package.json
@@ -3,13 +3,32 @@
"version": "0.0.1",
"private": true,
"type": "module",
+ "main": "electron/main.cjs",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"test": "vitest run",
"test:watch": "vitest",
- "typecheck": "svelte-check --tsconfig ./tsconfig.json"
+ "typecheck": "svelte-check --tsconfig ./tsconfig.json",
+ "electron": "electron electron/main.cjs",
+ "electron:dev": "vite build && electron electron/main.cjs",
+ "dist:win": "vite build && electron-builder --win --dir"
+ },
+ "build": {
+ "appId": "com.dispatch.app",
+ "productName": "Dispatch",
+ "directories": {
+ "output": "release"
+ },
+ "files": [
+ "dist/**/*",
+ "electron/**/*.cjs"
+ ],
+ "win": {
+ "target": "dir",
+ "icon": "../packaging/dispatch.png"
+ }
},
"dependencies": {
"dompurify": "^3.4.5",
@@ -23,6 +42,8 @@
"@tailwindcss/vite": "^4.0.0",
"@types/dompurify": "^3.2.0",
"daisyui": "^5.0.0",
+ "electron": "^35.0.0",
+ "electron-builder": "^26.0.0",
"svelte-check": "^4.0.0",
"tailwindcss": "^4.0.0",
"vite": "^6.0.0"
diff --git a/packages/frontend/vite.config.ts b/packages/frontend/vite.config.ts
index ca947d0..1b9921b 100644
--- a/packages/frontend/vite.config.ts
+++ b/packages/frontend/vite.config.ts
@@ -3,6 +3,7 @@ import tailwindcss from "@tailwindcss/vite";
import { defineConfig } from "vite";
export default defineConfig({
+ base: './',
plugins: [tailwindcss(), svelte()],
server: {
port: 5173,