🖥️ iKeyMon — macOS App for Monitoring KeyHelp Servers
iKeyMon is a native macOS app written in SwiftUI that provides live monitoring for your KeyHelp servers using the KeyHelp API.
✅ Current Features
- Displays key system information from your KeyHelp server via the API
- Shows CPU load, memory usage, swap usage, and disk usage
- Periodic ping via
/api/pingendpoint to check if a server is reachable - Colored status indicator for each server in the list
- Automatic updates:
- Ping every 10 seconds
- Server info every 60 seconds
- Optional automatic update checks that watch the latest Gitea release (with manual “Check now” button and prerelease channel toggle)
- Organized layout using tabs: General / Resources / Services
- Stores API keys securely in the macOS Keychain
- Native macOS look & feel using SwiftUI
📸 Screenshots
| General | Resources | Services | Edit Server |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
🛠️ Planned Features
- Preferences dialog
- macOS notifications if servers or services become unavailable
- Optional iOS support if there is demand
🚀 How to Run
Clone the repo and open it in Xcode. You can build and run the app on macOS 14+.
git clone https://git.24unix.net/tracer/iKeyMon
cd iKeyMon
open iKeyMon.xcodeproj
Local release build
Use the helper script to produce distributables in dist/:
./scripts/build_release.sh
It cleans previous artifacts, builds the Release configuration, and drops both iKeyMon-<version>.zip and iKeyMon-<version>.dmg into the dist folder (ignored by git). To enable codesigning + notarization, copy signing.env.example to .signing.env, fill in your Developer ID identity, Apple ID, team ID, and app-specific password. The script sources that file locally (it remains gitignored) and performs signing/notarization when the values are present.
To auto-publish the artifacts as a Gitea release, extend .signing.env with:
GITEA_TOKEN="..."
GITEA_OWNER="tracer"
GITEA_REPO="iKeyMon"
# optional: GITEA_API_BASE="https://git.24unix.net/api/v1"
# optional: GITEA_TARGET_COMMIT="master"
# optional: GITEA_PRERELEASE="false" # defaults to true until preferences are done
GITEA_TARGET_COMMIT defaults to the current HEAD commit, so overriding it lets you publish from another branch if needed. Whenever those variables are set, the script will create (or reuse) tag v<version> and upload both ZIP and DMG as release assets automatically.
Update checks
- The app can automatically query the Gitea release feed on launch (Preferences → Updates → “Automatically check for updates”).
- “Check for updates” also lives in the main window toolbar; if you're already up to date, you'll get a confirmation alert.
- Preferences let you opt into prerelease builds (enabled by default for now because current releases are flagged prerelease) and show the latest fetched release number for reference.
- When a newer build is available, a prompt offers to open the DMG download (or you can revisit the release info inside Preferences).
Versioning workflow
- The canonical marketing version lives in
version.jsonand follows the formatYY.major.minor(example:26.1.2). Update that file manually whenever you cut a new release branch. - The build number is derived automatically from the git commit count on the current branch (you can override it by exporting
BUILD_NUMBERbefore running the script if needed). - Run
./scripts/sync_version.shanytime after editingversion.json(the release script already calls it). The helper updatesMARKETING_VERSIONandCURRENT_PROJECT_VERSIONinsideiKeyMon.xcodeproj, keeping Xcode, the app bundle, and release artifacts in sync. scripts/build_release.shreads the sameversion.jsonfor naming the generated ZIP/DMG, so the artifact names, Info.plist values, and UI displays all stay aligned.
📦 License
MIT — see LICENSE for details.
You're free to build and use this app however you want, but please don't upload an unchanged version to the App Store under the same name. Once it's stable, I may release it on the App Store for a small fee (1–2€) to cover my Apple Developer account.
💬 Feedback
Join the discussion (in German) here: 🔗 https://community.keyhelp.de/viewtopic.php?t=13851



