The App menu title and the "About X / Hide X / Quit X" items come from NSProcessInfo.processName (macos.zig:6165-6176, used at :6203-6222) — the executable name for a bare binary. Every app launched through the shared craft binary shows "craft" in the menu bar, in Hide/Quit, and in Activity Monitor. The only fix today is full .app packaging (packageApp writes CFBundleName).
stacksjs/harness ships a workaround worth deleting: it creates a symlink named harness in a temp dir and spawns the binary through it, purely so processName reads right (app/Commands/Desktop.ts, namedAs()).
Ask: an --app-name <name> flag (and craft.json key). Implementation is small — NSProcessInfo.processName is settable (setProcessName:, plus updating the App menu items craft already builds itself in createApplicationMenu()), or at minimum craft can title its own menu items from the flag instead of the process. Dev-mode apps get their identity back without a packaging step.
🤖 Generated with Claude Code