Technical write-up

How PausePace detects calls without the microphone

PausePace for Mac holds a break until a call, video or presentation is over. It does this without asking for Microphone, Camera, Screen Recording or Accessibility access. This page lists the macOS signals it reads, the rules it applies to them, and where those rules fall short.

Published:

  1. Signals

    • Microphone or camera in use (yes/no)
    • Seconds since last input
    • Front app, full screen, display kept awake
    • Locked or asleep
  2. Rules

    • Hold while a call, video or presentation goes on
    • Wait for a typing pause, an app switch or the end of a hold
    • Never postpone longer than the cap
  3. Break

    • A short heads-up
    • The break card on your Mac
    • The same break on iPhone and Apple Watch, if paired
Signals become holds and natural moments; the timer turns them into a break at a good time.

In short

  • PausePace reads a few yes/no and timing signals that macOS gives any app, such as whether a microphone or camera is in use and how long since your last key press.
  • It never reads what you type, what is on screen, window titles, audio or video.
  • The signals are checked once a second, on the Mac, and never leave it.
  • A call can delay a break, not cancel it. By default, holds can postpone a due break by 30 minutes in total.

The signals it reads

Each signal comes from a standard macOS API or system notification that works inside the App Sandbox without a permission prompt. Each one is read by its own small component, and none of them can change the timer directly.

Microphone in use
API: kAudioDevicePropertyDeviceIsRunningSomewhere (Core Audio)
Asked of every audio device that has an input stream. The answer is yes or no. Output-only devices such as speakers are skipped, so playing music doesn’t count.
Camera in use
API: kCMIODevicePropertyDeviceIsRunningSomewhere (Core Media I/O)
Yes or no for each camera. No frames are read.
Time since last input
API: CGEventSource.secondsSinceLastEventType
Seconds since the last key press, click and mouse movement. This call doesn’t say which key or where.
Front app
API: NSWorkspace.frontmostApplication
The app’s bundle identifier and its App Store category from its Info.plist, used to notice app switches and games. No window titles.
Calling app open
API: NSWorkspace.runningApplications
Whether a known calling app (Zoom, Teams, FaceTime, Slack, Webex and others) or a web browser is open. Bundle identifiers only.
Full screen
API: CGWindowListCopyWindowInfo and CGDisplayBounds
Compares the position and size of the front app’s windows with each display. Window names and contents are not read.
Display kept awake
API: IOPMCopyAssertionsByProcess
Which processes ask macOS to keep the display on (PreventUserIdleDisplaySleep, NoDisplaySleepAssertion), as video players and slideshows do.
Locked, asleep or screen saver
API: com.apple.screenIsLocked, the screen saver notifications and the NSWorkspace sleep and wake notifications
Tells the timer you have stepped away. The display going to sleep counts too.

From signals to a call

Raw signals are noisy. Dictation turns the microphone on; a video preview keeps the display awake for a moment. So a signal has to last before it counts as a hold, PausePace’s word for “don’t interrupt now”:

  • Video call: a camera has been running for 10 seconds.
  • Audio call: a microphone has been running for 10 seconds, and the camera is on or a calling app or web browser is open. Browsers count because Google Meet and Teams on the web run inside them.
  • Video or slideshow: the front app, or one of its helper processes, has kept the display awake for 15 seconds, and it either fills the screen or you haven’t typed or clicked for 30 seconds. Keep-awake utilities such as caffeinate and Amphetamine are ignored.
  • Presentation or game: the front app fills a whole display and is Keynote, PowerPoint, WPS Office, QuickTime Player or an app in the Games category. A full-screen editor or browser is not a hold, because many people work full screen all day.

A muted microphone still counts as in use, which is what you want during a call. Each kind of hold (calls, video, presentations) can be turned off in Settings.

Choosing the moment

When your work time is up (20 minutes by default), the break is due, but PausePace doesn’t show it straight away. It waits for a natural moment:

  • a hold has just ended, for example you hung up;
  • you switched apps in the last 3 seconds;
  • you stopped typing and clicking for 8 seconds.

Then a heads-up appears (20 seconds by default) before the break starts, with the reason, such as “Good moment — a call just ended.” If no natural moment comes within 5 minutes, not counting time spent in a hold, the heads-up appears anyway.

When a call runs long

Holds can postpone a due break by 30 minutes in total; you can change this in Settings. When that time is used up, the heads-up appears even if the call is still going, and it runs its full countdown so you still get a warning. In Gentle and Balanced you can snooze it; Firm doesn’t allow snoozing.

Work time keeps counting while a break waits. A meeting can delay a break, but it can’t erase one.

When you step away

A locked screen, sleep or the screen saver means you are away straight away. Otherwise, after 45 seconds without input PausePace assumes you may be reading and keeps counting work time. After 5 minutes without input you count as away. Away time doesn’t add to work time, and 5 minutes away counts as a break. During a hold, quiet input alone never makes you away, because sitting still in a call isn’t a break.

During a break, 3 seconds of continuous input pauses the countdown and 5 quiet seconds resume it, so a break only counts while it is actually a break.

What it never reads, and what it asks for

PausePace never reads keystrokes, screen contents, window titles, audio or video. It never asks for Microphone, Camera, Screen Recording or Accessibility access, and the app doesn’t have the sandbox entitlements for audio or camera input, so macOS wouldn’t give it either. You can check: after installing, open System Settings → Privacy & Security. PausePace isn’t in those lists.

It may show three system prompts, each tied to something you choose:

  • Notifications: optional, for break alerts.
  • Calendar: only if you turn on calendar heads-up (Pro).
  • Local Network: only when you pair an iPhone. Until then the Mac doesn’t listen on the network.

There is no account and no analytics in the app. The signals are used in memory and thrown away. What stays on disk is the timer state and your break history, which you can limit or turn off in the app.

Calendar heads-up (Pro)

If your next break would land inside a busy event that starts within 10 minutes, PausePace offers the break just before it, as long as at least half of your work time has passed. Through EventKit it reads each event’s start and end, its availability and whether you declined it. It never reads titles, notes, locations or other attendees, and keeps nothing on disk. All-day, cancelled, free and declined events are ignored.

One honest caveat: macOS gives an app either full access to your calendars or permission to add events only. Reading event times needs full access, so that is what the system prompt asks for. PausePace still reads only the times and availability listed above and stores none of it. Turning the feature off stops the reads, and you can remove the access in System Settings → Privacy & Security → Calendars.

Pairing an iPhone

The iPhone app can mirror your Mac, and Apple Watch gets the break status from the iPhone. The Mac and iPhone talk directly over your local network; no PausePace server is involved.

  • The Mac advertises itself over Bonjour (_pausepace._tcp) and shows a 6-digit code. The pairing window closes after 2 minutes or 5 wrong attempts.
  • The code becomes a pre-shared key (HKDF-SHA256) for a TLS 1.2 PSK connection, so a wrong code fails the handshake.
  • Inside that connection both devices run an ephemeral X25519 key exchange. The Mac sends a random 256-bit secret, sealed with ChaCha20-Poly1305 under a key derived from the exchange and the code. Someone who records the pairing and guesses the code later still can’t recover it.
  • The secret is kept in the Keychain on each device, marked this-device-only, so it never syncs through iCloud. Every later connection uses TLS with a key derived from it.

What the Mac sends is the break status (for example “waiting for a call to end”) and daily totals. The signals on this page are not sent.

Limitations

  • Screen sharing alone isn’t detected. macOS has no public, permission-free signal for it. If you share your screen with the microphone and camera off, PausePace won’t know. It doesn’t use private APIs to find out.
  • Calls are inferred. A call that doesn’t use the microphone or camera in the usual way can be missed. And a microphone used for something else, such as dictation, while a browser or calling app is open can look like a call.
  • Some virtual cameras report their state inconsistently.
  • Full screen is a geometry check. A maximized window that isn’t quite full screen doesn’t match, and a full-screen document looks the same as full-screen video.
  • Video detection depends on the player keeping the display awake. Most do; some don’t.
  • Long calls get a break eventually, by design, once the postponement cap is used up.
  • Smart timing runs on the Mac. On an iPhone without a Mac, PausePace is a plain break timer and can’t see calls.

Questions

Does PausePace listen to my calls?

No. It asks Core Audio only whether an input device is running, which is a yes-or-no answer. It has no microphone permission and never opens an input device, so it can’t hear anything.

Does it work with Zoom, Teams and Google Meet?

Yes, through the camera and microphone signals. Zoom, Teams, FaceTime, Slack, Webex, Discord and several other apps are recognized by their bundle identifiers. Meet and other web calls are covered because browsers count too.

Will it ever interrupt a call?

Only after holds have postponed a break by the maximum, 30 minutes by default. Even then a heads-up comes first, and in Gentle or Balanced you can snooze.

Does anything leave my Mac?

Only if you pair an iPhone. The Mac then sends it the break status and daily totals, encrypted, over your local network. The signals described here stay on the Mac.