Yap / Privacy

Privacy

How the app and its authorization service handle your data.

Last updated September 27, 2026. Yap is an independent macOS application developed and operated by Michael Grinich, an individual. Contact mgrinich@gmail.com for privacy or security matters.

This policy describes the native public-client connection in Yap 0.1.8 and personal developer mode. Earlier versions used an authorization service to exchange or refresh Zoom tokens and authorize the Meeting SDK. Version 0.1.8 replaces those operations with direct communication between the Mac and Zoom. The corresponding legacy service endpoints are retired; upgrading requires a fresh Zoom sign-in. Publishing the source or this policy does not mean Zoom has approved external use.

Connecting Zoom

All modes open Zoom's sign-in and consent page in your browser and use PKCE to bind authorization to the initiating sign-in attempt. Yap does not receive your Zoom password. The return route and handling of developer credentials depend on the build and connection mode:

  • Official app, version 0.1.8: the Mac generates a PKCE verifier and keeps it locally. It sends only its S256 challenge, public client ID, random sign-in identifier and a separate handoff challenge over HTTPS to the project's callback service on Cloudflare Workers. The service returns a Zoom authorization URL using the fixed public client ID and HTTPS callback. An encrypted session binds that request to the app's sign-in attempt. Zoom sends the authorization code to that HTTPS callback. The browser's Open Yap link returns an encrypted code handoff through yap://oauth/zoom; it contains no plaintext authorization code, verifier or OAuth token. The initiating Mac redeems the handoff with its separate proof, then exchanges the authorization code and PKCE verifier directly with Zoom. It saves the resulting OAuth tokens in Keychain. No Zoom client secret is required or shipped in the app.
  • Personal developer mode: you supply your own developer configuration. The Mac receives Zoom's response through a temporary loopback listener; OAuth code exchange and refresh go directly from the Mac to Zoom. Your SDK secret remains in the Mac's Keychain, and SDK authorization is signed locally. This mode does not use the project-operated authorization service.

In the official app, token exchange and refresh go directly from the Mac to Zoom. The Meeting SDK uses Zoom's public-client authentication API; the app does not request a server-signed SDK token. Meeting credentials and recordings are also requested directly from Zoom. OAuth access and refresh tokens remain available to the native app as required for these user-authorized operations; they are not sent to or returned by Yap's callback service.

The callback service processes authorization codes, public challenges and handoff proofs in request memory. It does not exchange codes, receive OAuth PKCE verifiers, process OAuth access/refresh tokens, fetch meeting credentials or maintain a user/token database. These values are not written to application logs or persistent server application storage. The encrypted session and handoff share a maximum three-minute deadline. They pass through the browser and may remain in browser history; expiry does not erase history. Redeeming a handoff requires its separate proof held by the initiating Mac. The app consumes its pending sign-in identifier once; the stateless service does not maintain a separate record of redeemed handoffs. Zoom enforces authorization-code redemption with the OAuth PKCE verifier. This is not a claim that authorization data never transits a server or browser.

For abuse prevention, the service limits requests by source IP address. Its application error log contains a fixed failure event, not exception text or request content. Worker invocation logs and traces are disabled. Configured application error events follow Cloudflare Workers Logs retention. Cloudflare also processes network/security information such as IP addresses and traffic metadata under its privacy policy; disabling application request logs does not eliminate that infrastructure processing. No particular country of processing is promised.

Meetings, recordings and Calendar

The Mac connects to Zoom for meeting creation, recording lists and downloads. Zoom's Meeting SDK carries live audio, video, screen sharing, participant information, meeting chat and files you choose to send in chat. When permitted by the meeting's settings, files can be sent to everyone or an individual participant; received attachments are downloaded through the SDK when you choose to save them. Choosing computer-audio sharing sends sound from apps on your Mac to the meeting without sharing a screen or window. The app's authorization service does not receive that content, meeting numbers, recording files, saved chat, transcripts or Google Calendar data. Zoom and its delivery infrastructure receive the requests needed for their services.

When you take a group photo, Yap uses macOS screen capture to capture participant camera tiles from the call window and assemble a photo locally. The completed PNG is automatically saved to your Downloads folder. Yap also attempts to share a generated shutter sound with the meeting through Zoom; if sharing is unavailable, the sound plays on your Mac only. Taking the photo does not automatically send the image to other participants or the app's authorization service.

Recording playback and saved chat/transcript retrieval use the account's authorized Zoom download URLs. Where Zoom redirects a download to a non-Zoom CDN, the app removes the Zoom OAuth authorization header. Content you explicitly send, share, record, save or export remains subject to your permissions and other participants' rights.

Google Calendar is optional. The app requests read-only calendar-list and event access and reads directly from Google. It displays upcoming Zoom meetings from calendars you select; it does not create events, send invitations or change RSVPs. Google tokens and calendar data are not sent to the project-operated authorization service. Use and transfer of Google API data follow the Google API Services User Data Policy, including its Limited Use requirements. The app does not sell account or meeting data, use it for advertising, or send it to train AI models. Spoken transcripts displayed by the app are existing Zoom recording artifacts.

After Google returns to the app's temporary local callback, builds with the branded completion page send the browser to https://yap.enterprises/ with only a fixed sign-in outcome in the page path. Authorization codes, state values, PKCE verifiers, tokens, account identifiers and calendar content are not forwarded to that page. The website host receives normal browser request information such as the IP address, browser information and requested outcome path. The completion pages use no analytics, cookies or external tracking resources; the app suppresses the callback URL as a referrer. The page's Open Yap button activates the app; it does not itself authorize or connect an account. Older builds display the completion page locally.

Storage, retention and your choices

Account configuration and OAuth tokens are stored in the macOS Keychain and cached in memory while the app runs. Earlier versions also stored managed signing grants; these no longer authorize the version 0.1.8 connection. Selected calendar metadata is cached locally so the agenda can open promptly. That account-bound cache has user-only file permissions and can contain meeting links/passcodes; it is not independently encrypted by the app.

Recording metadata, chat and transcript text, chat attachment metadata, participant thumbnails, and playback caches are held in memory while in use. A hidden player may retain a paused item and cache. Download-to-play can create a temporary local video retained for that playback source and removed during normal cleanup. A crash can interrupt cleanup. Explicitly saved videos, chat attachments, saved chat and transcript exports remain where you choose until you delete them. Saved chat includes messages available in Yap at export time, participant names, recipients, timestamps and attachment metadata such as filenames and sizes. Group photos remain in Downloads until you move or delete them. The app does not independently encrypt or remotely erase these saved files. Zoom manages its own SDK storage, including original avatar files and a separate safe-meeting Keychain item.

Importing a custom camera background creates a PNG copy in ~/Library/Application Support/Yap/Camera Backgrounds/ and saves the selected image path and camera-effect preferences locally. The original photo is not changed. The Zoom SDK uses the imported image for the background and may keep its own local copy; the resulting background is visible in video you share with the meeting. Choosing another photo, selecting None, resetting effects or disconnecting Zoom does not delete previously imported copies. To remove Yap's copies, select None, quit Yap and delete the unwanted images from that folder. This does not remove any separate SDK-owned copies; contact the developer for help locating that storage.

Disconnecting an account removes its local app authorization and clears associated app caches/playback. Personal developer configuration may remain. Disconnecting locally does not revoke Zoom's or Google's server-side grant; you can separately remove access in the provider's account settings. Zoom validates account and meeting authorization. The service holds no per-user token database requiring a separate deletion request; rate-limit and provider infrastructure records follow their respective retention rules.

Deleting the app does not automatically erase saved files, group photos, imported camera backgrounds, every preference or SDK-owned storage. For help accessing, correcting or deleting information you supplied to the developer, email mgrinich@gmail.com. Reasonable identity verification may be needed. Support correspondence is kept as needed to handle the request, maintain a record of its resolution, and meet security or legal obligations; you can request deletion.

Updates, support and permissions

When configured, Sparkle contacts the release host to check for and download updates. System-profile sending is disabled. Unconfigured developer builds do not check a feed. GitHub and other sites you open receive normal web requests under their own policies.

GitHub Issues are public. The app does not automatically attach logs, credentials, meeting links or transcripts to reports. Use email for private matters and avoid including tokens or unnecessary meeting content. App lifecycle diagnostics exist locally; proprietary SDK logging is disabled.

Camera, microphone, screen sharing and notification access are controlled by macOS. Meeting access and recording remain subject to Zoom permissions and consent. You can stop sharing, leave a call, disconnect an account or change macOS permissions. Material changes to these data practices will be reflected in this policy; any additional consent required for a new use will be requested before that use.

Implementation details: credential storage, Calendar, recordings, and authorization service. The Terms describe the free preview's service terms.

Moving from a previous app version

Yap can migrate supported preferences, the agenda cache and saved connections from its earlier bundle identities. The active credential vault uses the app.yap.credentials Keychain service. The previous consolidated vault is retained under its existing protection; once the Yap vault exists, it takes precedence and the old vault is not reread. Disconnect clears active authorization and records removal markers so legacy data cannot restore that connection. Older app bundles and their protected migration copies are not automatically erased. Normal macOS approval may be needed for the new app identity. See Bundle identity for the exact migration boundaries.

Published from the project’s source document.