AlwaysOn is a macOS menu bar app that keeps your presence active in Microsoft Teams, Slack, Zoom, and similar workplace apps by simulating minimal user activity.
If you find this app useful, consider supporting its development:
- macOS 13.0 or later
- Requires Accessibility permission
- Runs in the menu bar with no Dock icon
- Built with Xcode 15+ and Swift 5.9+
- Start, pause, resume, or stop activity simulation from the menu bar
- Toggle the session from anywhere with the ⌥⌘K global hotkey
- Use mouse, keyboard, or alternating activity methods
- Optionally skip simulated input while you are actively using the machine
- Optionally pause simulation while no chat or meeting app is running
- Run quick timers or automate sessions with work hours
- Enable launch at login and optional notifications
- Save profiles for different activity and schedule setups
- Download the latest build from the Releases page.
- Open the DMG and drag
AlwaysOn.appto Applications. - Launch AlwaysOn from Applications.
- If macOS says Apple could not verify the app is free of malware, open System Settings > Privacy & Security, scroll to Security, click Open Anyway for AlwaysOn, then confirm Open Anyway.
- Grant Accessibility permission when prompted.
If Accessibility breaks after a reinstall or update, remove the old AlwaysOn entry from System Settings > Privacy & Security > Accessibility, then add and enable /Applications/AlwaysOn.app again.
- Clone this repository.
- Open
AlwaysOn.xcodeprojin Xcode 15+. - Build and run.
- Grant Accessibility permission when prompted.
git clone https://github.com/hafiezul/AlwaysOn.git
cd AlwaysOn
open AlwaysOn.xcodeprojBuild requirements: Xcode 15+, Swift 5.9+, macOS 13+ SDK.
AlwaysOn simulates minimal input on a configurable interval, with 45 seconds as the default.
- Mouse: moves the cursor by 1 pixel and immediately moves it back
- Keyboard: presses and releases the Shift key
- Alternating: switches between mouse and keyboard input
This keeps macOS from marking the system idle, which many workplace apps use to determine presence.
AlwaysOn registers the alwayson:// URL scheme, so launchers like Raycast and Alfred can drive it:
alwayson://startstarts a sessionalwayson://stopstops the sessionalwayson://togglestarts or pausesalwayson://timer?minutes=30keeps online for 30 minutes. Omitminutesto use the profile default.
- Accessibility permission is required because the app simulates keyboard or mouse input.
- Releases are unsigned and updated manually from GitHub Releases.
- If Accessibility stops working after an upgrade or reinstall, remove the old entry in Accessibility settings and add
AlwaysOn.appagain. - The app does not collect data.
Try launching AlwaysOn once, then open System Settings > Privacy & Security, scroll to Security, click Open Anyway for AlwaysOn, and confirm Open Anyway. macOS should remember this choice for future launches.
Remove any old AlwaysOn entry from System Settings > Privacy & Security > Accessibility, add /Applications/AlwaysOn.app again, enable it, and relaunch AlwaysOn.
Confirm Accessibility permission is enabled, confirm AlwaysOn shows an active session, and check whether your chat app is overriding presence with a custom status.
MIT License. See LICENSE.
Contributions are welcome through issues, discussions, and pull requests.