Who we are
OffMain ("OffMain," "the app," "we," "us") blocks your chosen distracting apps and sites. Your GitHub activity earns minutes, and you spend those minutes to open the blocked apps and sites for a bounded break. Real work buys real breaks.
- Data controller: Contemplative Software LLC, a Missouri limited liability company.
- Contact: privacy@offmain.dev
- Governing law: the State of Missouri, USA.
The short version
- OffMain reads your own GitHub activity and turns it into minutes that open apps and sites you chose to block. That is the entire purpose, and we hold only what serves it.
- OffMain has a backend. So that your contract and your minutes follow you across your devices, and a break you start on one device opens the others, some of your data is stored on our server.
- We keep your GitHub token encrypted on our server and use it only to read your own activity.
- We do not sell or share your data, run ads, or profile you. Two third-party services do see something. Sentry catches crashes and failures in the apps and the backend. PostHog measures traffic on this website only, with no cookies and no way to recognize you on a later visit. The sections below say exactly what each one sees and what it never sees.
- We never read your code. Our servers never ask GitHub for a diff or a file. We see which repository an event came from and how much you did. We count the characters in a commit message and the files it touched, then throw the text away.
- We are not affiliated with or endorsed by GitHub.
What we collect and store
OffMain runs a backend (a service hosted on Google Cloud in the United States, with a Cloud SQL Postgres database). When you use the app, we store the following, tied to your account:
Your account and identity
- Your GitHub user id and username, the email addresses connected to your GitHub account (used to attribute your commits), and your time zone.
- Sign-in sessions for your devices, so you stay signed in. We store a hashed refresh token, not a password. OffMain has no password.
Your GitHub connection
- You connect GitHub with "Continue with GitHub" (a GitHub App using OAuth). We receive an access token and a refresh token for your account.
- These tokens are encrypted at rest (AES-256-GCM) on our server and used only to read your own GitHub activity. The scope of what we can read is bounded by what you grant during sign-in.
Your contract
- The contract you author: what each GitHub signal pays in minutes, the hours the contract runs, and whether it is paused. Changes that loosen the contract are stored as pending edits until they land the next morning, and we keep a history of your contract edits.
- The websites and app categories you choose to block across devices are stored as part of your contract so they can sync.
- The native app selection you pick on iPhone through Apple's system picker stays on your device as opaque tokens. iOS does not reveal those app names to us, and we do not store them on our server.
Your minutes and your GitHub activity
- We receive events from GitHub (through a webhook and a backstop check) about your own activity: the repository name, whether that repository is private, the kind of event (such as a commit or pull request), an identifier, and when it happened. We use these to mint the minutes you spend.
- We do not store the contents of your commits, pull requests, issues, code, or messages. Before we write a delivery down, we trim it to the fields above. From a commit we also keep three things: the number of files it touched, the length of its message, and whether it was a force-push. They let us spot a burst of trivial commits, so the contract cannot be gamed.
- We keep a ledger of your minutes (what each event earned, what each break spent, and the morning top-ups) so your balance adds up and you can see your history, and a record of the breaks you start (when they began and end).
- When a commit does not count (for example, it was authored under an email not connected to your account), we record the commit's identifier, that email address, and when it happened, so the app can show you instead of dropping it silently. We write that record only for pushes you made yourself. If a commit in your own push names a co-author whose email is not on an OffMain account, we record that address the same way. We delete these records after 30 days.
- A count of the private work we cannot see. GitHub publishes one number: how many contributions you made to repositories OffMain has no access to. We ask for that number and nothing else. It carries no repository name, no commit, no message, no timestamp, and no way to tell one contribution from another. We read it over your last 90 days to set your starting weights: when you sign in with the source on, and, if you had it off then, at the moment you turn it on. After that we read one day at a time: when you open the app, no more than once every 90 seconds, and on a background check every 30 minutes. We store the number, when we last read it, and what it earned you. A switch in Settings turns the source off, and off means we never ask GitHub, not that we ask and drop the answer.
- A guess about one of your GitHub settings. GitHub only publishes that number when your profile has Include private contributions turned on. If the number is zero but we can see private work of yours in a repository we do reach, we conclude the setting is off, and we say so in the app rather than let you wonder why private work earns nothing. When we can see nothing to check it against, we record that we cannot tell. That verdict is stored alongside your GitHub connection.
Your devices
- For each device you install OffMain on, we store the platform (for example iPhone, Mac, or browser), a push token so we can tell the device the moment a break starts or your contract changes, and when it was last seen.
Beta telemetry
- During the private beta, the app sends us one summary a day per device: counts and rough time-of-day ranges (for example, how many times the block screen was seen), never app names, never exact timestamps, never browsing history. On iPhone and Mac, the same Beta data switch in Settings that controls crash reporting turns this off too, and a local log on the device shows every payload sent. It is stored in our own database and used only to judge whether the product works.
The waitlist
If you join the waitlist on this site, we store the email you enter with Resend, our email provider, so we can tell you when the beta opens and send the occasional OffMain update. That is all we use it for. We do not sell it, share it for marketing, or add it to any other list. Every email we send has a one-click unsubscribe, and you can ask us to delete your address at any time at privacy@offmain.dev.
Crash and error reporting
To find and fix crashes and failures, OffMain uses Sentry, a third-party error-reporting service. When something breaks, we send Sentry the error details, the stack trace, and a sample of performance traces (how long a request took). This data goes to Sentry's servers, where they process it on our behalf.
Each report carries your OffMain account id, so we can tell when the same failure reaches you across more than one of your devices, along with basic device and operating-system information. We scrub each report before it leaves your device. It never includes the apps or sites you block, your usage timings, your session or push tokens, or any of your GitHub content.
In the iPhone, Mac, and Android apps, error reporting is on by default, and you can turn it off at any time in the app's settings. On iPhone and Mac that control is the Beta data switch, and it is a single switch: it governs both crash reporting and the beta telemetry above, so turning it off stops both. The browser extension is the exception: there it stays off unless you turn it on. Our backend reports its own server-side errors to Sentry as part of running the service.
Website analytics
This website, offmain.dev, uses PostHog to count traffic. The apps do not. PostHog runs here in cookieless mode: it sets no cookies and writes nothing to your browser's local or session storage. This site keeps two things on your device, both in your browser's local storage and both written only after you act. The color theme you pick from the header. And, if you join the waitlist, the email you entered and your seat number, so the page can show you on a later visit that you already joined. A "start over" link under that message clears it. The site never sends either value back out, and PostHog never reads them, so there is nothing here to consent to and no cookie banner.
What PostHog receives for a page view: the page you are on, the site that linked you here, how far down the page you got, your browser and operating system, your device type, and a country-level location derived from your IP address. To count visitors without storing anything, PostHog turns your IP address and browser details into a hash on its own servers. That hash changes every day, so we cannot tell a returning visitor from a new one, and we cannot follow you from one day to the next.
What PostHog never receives: your email address or anything else you type into the waitlist form, your name, your IP address as a stored value, and any data from inside the OffMain apps. Session replay is off, here and permanently. We do not record your screen, your mouse, or your keystrokes.
If your browser sends a "Do Not Track" signal, we load no analytics at all. Blocking us.i.posthog.com in your content blocker has the same effect, and nothing on the site breaks.
Where your data lives
We use a small number of service providers to run OffMain. They process data on our behalf, under their own terms:
- Google Cloud, which hosts the backend (Cloud Run) and provides the Postgres database (Cloud SQL), in the United States.
- Sentry, our error-reporting provider, which receives the crash and error reports described above.
- PostHog, our website analytics provider, on its United States cloud, which receives the cookieless page-view data described above from this website only.
- Resend, our email provider, which holds your waitlist email and delivers the emails we send you.
- Cloudflare, which serves this website and runs the waitlist form. Like any host, it sees your IP address in transit to answer the request, and it keeps short-lived request logs we read to fix errors. The waitlist form also runs Cloudflare's Turnstile bot check, which may hold its own short-lived state in your browser while the check runs. We never store your IP address, and the apps do not use Cloudflare.
- Apple (Apple Push Notification service), which delivers the silent notification that starts your break on your iPhone and your Mac.
- Your browser's push service, for the extension. The company behind it follows the browser you chose: Google for Chrome and Edge, Mozilla for Firefox, Microsoft for older Edge, Apple for Safari. Each one delivers the same empty notification and learns only that we sent your browser one.
- Google (Firebase Cloud Messaging), which is how that notification will reach Android. The Android app registers a token with Google today. We do not send through it yet.
- GitHub, the source of the activity OffMain reads, on your authorization.
How we use your data
We use the data above only to provide the app: reading your own GitHub activity, pricing it into the minutes you earn, keeping your contract and balance in sync across your devices, starting the breaks you spend minutes on, notifying your devices the moment a break starts, and catching crashes and errors so we can keep the app working. The separate website analytics described above are used only to see how many people reach this site and which pages they read. We do not sell or rent your data, use it for advertising or profiling, or share it with third parties beyond the providers above.
What we do not do
- No ads, no selling or sharing your data for marketing.
- No advertising, no ad networks, no cross-site tracking, and no analytics of any kind inside the apps. The website uses cookieless analytics, described above. We use Sentry for crash and error reporting, also described above.
- No cookies on this website, and no session replay.
- No reading of your code, and no storing of your commit messages, pull request text, or issue contents.
- No access to the native apps you block on your device.
GitHub data and GitHub's rules
OffMain reads your own GitHub activity through GitHub's API, which is a permitted use. We handle that data in line with the GitHub Terms of Service and the GitHub Privacy Statement. We do not use the GitHub API to download data for spam, to sell personal information, or to incentivize inauthentic activity.
OffMain is not affiliated with, sponsored by, or endorsed by GitHub. "GitHub" is a trademark of GitHub, Inc., used here only to describe compatibility.
Security
Your GitHub tokens are encrypted at rest. Traffic between your devices and our backend, and between our backend and GitHub, uses HTTPS. We limit who and what can read your data to what the app needs to function.
Retention
We keep your data while your account is active. When you delete your account, or ask us to, we delete the data we hold for you, including your GitHub tokens, contract, minutes ledger, activity history, and device records. Disconnecting GitHub removes your stored tokens. Our database keeps automatic backups so we can recover from a failure. A deleted account can stay in those backups for up to 7 days after deletion. We never restore a backup except to bring the whole service back, and after that window the account is gone from the backups too.
Some records go sooner, on a fixed schedule, whether or not your account is active. We delete webhook delivery records and skipped-commit records after 30 days. We delete the per-event activity rows after 400 days, which is long enough to redraw a full year of your history. Your daily summaries, your minutes ledger, and your contract stay for the life of your account. The private-work count, the setting verdict above, and the minutes they earned have no fixed window either. They stay for the life of your account and go when you delete it.
Your choices and rights
- Disconnect GitHub: removes the tokens we hold, and the app can no longer read your activity. You can also revoke OffMain's access from your GitHub account settings.
- Delete your account: removes the data we hold for you, including your GitHub tokens, your contract, your minutes ledger, your activity history, and your device records. On iPhone and on the Mac, Settings has a Delete account control that does it. In the browser extension and on Android, that control is not built yet, so email privacy@offmain.dev and we will delete it. Uninstalling the app removes the on-device data on that device.
- Access, export, or correction: email privacy@offmain.dev and we will help.
- If you are in the EEA, UK, or California, you have additional rights over your data. Email privacy@offmain.dev to exercise them.
Children's privacy
OffMain is intended for developers aged 16 and older. It is not directed to children, and we do not knowingly collect personal data from anyone under 16. OffMain uses individual (device-owner) Family Controls authorization, not parental/guardian controls.
App Store privacy
OffMain collects data that is linked to you, as described above (your GitHub identity and activity, a count of your private work, your contract and minutes, and device records), to provide the app. We do not use it to track you across other companies' apps or websites.
Changes to this policy
We may update this policy as OffMain evolves. We'll post changes here with a new "Last updated" date; if a change materially affects how your data is handled, we'll also surface an in-app notice.
Contact
privacy@offmain.dev