Lemoniscate.app is a native AppKit admin frontend for lemoniscate.
It starts, stops, and restarts the server process and streams runtime logs.
From the repository root:
make all
make gui
make appThis produces:
lemoniscate(server binary)lemoniscate-gui(GUI executable)Lemoniscate.app(app bundle)
open Lemoniscate.app./lemoniscate-guiExpected bundle contents:
Lemoniscate.app/
Contents/
Info.plist
MacOS/
Lemoniscate
lemoniscate-server
At runtime, the GUI looks for lemoniscate-server in:
- The app bundle at
Contents/MacOS/lemoniscate-server - As a sibling binary next to
Lemoniscate.app(same name:lemoniscate-server)
make app validates that lemoniscate and lemoniscate-gui target the same CPU architecture before packaging.
If architectures do not match, packaging fails with a clear error. You can bypass this with:
APP_SKIP_ARCH_CHECK=1 make appUse bypass only for intentional advanced cases.
When you click Start, the GUI invokes:
lemoniscate-server --config <configDir> --bind <port> --log-level info
--bind is accepted by the server as an alias for --port.
- The GUI persists selected UI values in
NSUserDefaults; it is not yet a full editor for writing allconfig.yamlsettings. - If the config directory does not exist, GUI creates the directory, but it does not generate full default scaffolding (
Users,config.yaml,Banlist.yaml, etc.). - For a clean first-time setup, initialize config first:
./lemoniscate --init -c ./configThen point the GUI at that directory.
- "Server binary not found"
- Ensure
lemoniscate-serverexists inLemoniscate.app/Contents/MacOS/. - Or place
lemoniscate-servernext to the app bundle for fallback detection.
- Ensure
- "Architecture mismatch" during
make app- Rebuild both
lemoniscateandlemoniscate-guion the same target architecture/toolchain.
- Rebuild both
- Server fails to start from GUI
- Confirm the selected config directory exists and contains valid files.
- If this is first run, create defaults with
./lemoniscate --init -c <dir>. - Verify the selected port is free.
- Logs tab appears quiet
- Start the server first; logs are streamed from stdout/stderr only while process is running.