Read-only by design
MobileHog can only read from PostHog: it requests 12 permissions, all ending in ":read", and never a write scope. Your phone talks to PostHog directly, credentials stay in the iOS Keychain or Android Keystore, and there is no MobileHog server your data could pass through.
Updated
Where your data goes
The app sends every request straight to PostHog: us.posthog.com, eu.posthog.com, or the address of your self-hosted instance. Nothing is proxied, mirrored or logged by us. The app contains no analytics, crash-reporting or advertising SDKs. The only thing it ever fetches from mobilehog.app is a small public file that PostHog needs for sign-in.
Every permission, explained
5 permissions are required: without them there is nothing to show. The other 7 each unlock exactly one screen. If you leave one out, that screen tells you which permission it is missing and everything else keeps working. Signing in with a PostHog Cloud account also requests openid profile email so the app can show which account you are using.
| Permission | Needed | What it’s for | API it calls |
|---|---|---|---|
| user:read | Required | Confirms who you are when you connect. | GET /api/users/@me/ |
| project:read | Required | Lists the organizations and projects you granted access to. | GET /api/organizations/, /api/organizations/:id/projects/ |
| dashboard:read | Required | Reads your dashboards and their tiles. | GET /api/projects/:id/dashboards/ |
| insight:read | Required | Reads your saved insights. | GET /api/projects/:id/insights/ |
| query:read | Required | Runs the read-only queries behind every number: tile results, web analytics, recent events. | POST /api/projects/:id/query/ |
| error_tracking:read | Optional · Errors | Lists error tracking issues with occurrences and affected users. | POST /api/projects/:id/query/ (ErrorTrackingQuery) |
| feature_flag:read | Optional · Feature flags | Lists feature flags and their rollout. | GET /api/projects/:id/feature_flags/ |
| experiment:read | Optional · Experiments | Lists experiments. | GET /api/projects/:id/experiments/ |
| survey:read | Optional · Surveys | Lists surveys. | GET /api/projects/:id/surveys/ |
| session_recording:read | Optional · Session replays | Lists recent session recordings. Playback opens in your browser. | GET /api/projects/:id/session_recordings/ |
| cohort:read | Optional · Cohorts | Lists cohorts. | GET /api/projects/:id/cohorts/ |
| annotation:read | Optional · Annotations | Lists annotations. | GET /api/projects/:id/annotations/ |
This table is generated from the list the app itself uses when it signs in, so it can’t fall behind the app.
How sign-in works
- OAuth 2.0 with PKCE. You sign in on PostHog’s own page, in your phone’s system browser. The app never sees your password, and it is a public client without a secret that could leak.
- You choose the scope of access. PostHog’s consent screen lets you grant all organizations, specific organizations or specific projects. MobileHog shows exactly what the token covers.
- Registered by URL, not by us. PostHog identifies MobileHog through a public client document at
mobilehog.app/oauth-client.json, which lists the only address a sign-in may return to. - Self-hosted PostHog connects with a personal API key you create yourself, with only the permissions you tick.
What is stored on your phone
- Tokens and API keys live in the iOS Keychain or Android Keystore. Access tokens expire after about ten hours; refresh tokens rotate on every use, so an old one stops working as soon as a new one is issued.
- Recent results are cached on the device so the app opens instantly. They never leave the phone.
- “Remove connection” in Settings deletes the credentials and every cached value, and revokes the sign-in token with PostHog.
Your query quota
PostHog meters queries per project. MobileHog reads PostHog’s cached results first and only asks for a fresh calculation when you pull to refresh. Nothing runs in the background: the app only talks to PostHog while you’re looking at it. Settings shows how much of your project’s query budget is left.
Reporting a security issue
Email klaus@7eicher.net with “Security” in the subject. Please don’t include tokens or keys. We answer every report. See also our security.txt and theprivacy policy.