Sheaf

Sheaf Android App Privacy Policy

Effective: 2026-08-02.

This policy covers the Sheaf Android app binary published by Lupine Systems LLC at https://github.com/sheaf-project/android and on Google Play, IzzyOnDroid, and other app stores. It describes what the app does on your device and what third parties the app interacts with as part of running.

It does not cover:

1. Data controller

For everything in this policy, the data controller is Lupine Systems LLC. See /legal/ for full company identification and contact details.

For data sent to a Sheaf instance via the app, the controller is the operator of that instance (which, for the official hosted services, will be Lupine Systems too).

2. What the app stores on your device

The app keeps the following on the device's local storage (specifically: Android DataStore, Android-Keystore-backed where applicable, and Room for cached content). None of it leaves the device unless you explicitly send it to your chosen Sheaf instance.

Data Purpose Where
API base URL of your chosen instance Knowing where to send requests DataStore
Access token + refresh token Keeping you signed in DataStore (Android-Keystore-backed)
FCM device token (Play build only) Letting your instance address notifications to this device DataStore
UI preferences (theme mode, notification toggle, app-lock toggle) UX state DataStore
Cached members, groups, journals, fronts Faster screen loads, offline read Room (SQLite)
Avatar / image cache Faster image loads Coil disk cache

Tokens and cached content are wiped on sign-out and on app uninstall.

3. Data the app sends to your chosen Sheaf instance

When you use the app, it makes HTTPS requests to whatever Sheaf instance you've configured (https://...). The contents of those requests are whatever you do in-app: members you create, fronting switches you log, journals you write, files you upload, your account details, etc.

The processing of that data is governed by the operator of your chosen instance, under their own privacy policy. The Sheaf protocol does not bake any analytics or telemetry into client-server traffic; only data you create is transmitted.

If you run a self-hosted instance (your own or someone else's), the operator of that instance is the controller of that data — not Lupine Systems.

4. Third-party services the app talks to

The Android app interacts with the following third parties as part of running on Android. These are separate from any third parties used by your chosen Sheaf instance (which will be listed in that instance's own privacy policy).

4.1 Google (Google Play Services / Wearable Data Layer)

If you have the Sheaf Wear OS companion app installed alongside the phone app, the two communicate over Google's Wearable Data Layer, an inter-process communication mechanism provided by Google Play Services. This is required by the Wear OS platform; there is currently no FOSS alternative.

The Data Layer does not relay messages through Google Cloud servers. Per Google's documentation, Data Layer items are "private to your app and only accessible to your app on other devices," and the API works only between paired Android-or-Wear-OS devices over their local Bluetooth or Wi-Fi link — it does not function at all if the two devices are out of range of each other. Google Play Services on each device handles the local IPC and synchronisation queue, analogous to the role the operating system plays in any inter-app communication, but message contents are not visible to Google's infrastructure.

The data exchanged between phone and watch is your own app credentials (so the watch can sign in to your chosen Sheaf instance independently) and small UI-state messages. Both devices need Google Play Services installed for the channel to work; this is a property of running on Wear OS rather than something the Sheaf app introduces. If you don't install the Wear companion or don't pair a watch, the Wearable Data Layer is not used.

4.2 Push notifications (and why the build you installed matters)

The Android app is built in two flavours, and they differ specifically on this point. Which one you have is worth knowing.

The Play Store build (systems.lupine.sheaf) uses Firebase Cloud Messaging, Google's push service. Push is opt-in: nothing happens until you enable notifications and grant the Android notifications permission. If you do, the app registers with FCM, receives a device-specific token, and sends that token to your chosen Sheaf instance so the instance can address notifications to this device.

Google sees push metadata as part of delivering it: the target token, timing, and the payload the instance sends. How much detail is in that payload is a setting on the instance side, per notification channel, so if you would rather Google never see member names in a payload, use the lower payload-sensitivity setting when you configure the channel. Disabling notifications stops delivery; removing the device in the app's notification settings, or signing out, clears the token from the instance.

The open build (systems.lupine.sheaf.open, distributed via GitHub Releases and IzzyOnDroid) contains no FCM and no push provider at all. It ships a no-op token provider in place of the Firebase one, so there is no Google push dependency compiled into the binary and no token to register. If you want Sheaf on Android with no Google push involvement whatsoever, install that build. You can still receive front-change notifications through the channels that do not need a mobile push provider: ntfy, Pushover, web push, or a webhook.

This is a build-time difference, not a setting. Switching between the two means installing the other build.

4.3 Sigstore (transparency log)

Each released APK is signed by our CI workflow via sigstore/cosign keyless OIDC; signatures are recorded in the public Rekor transparency log. This involves no user data: only the signature, the cert tying it to our CI workflow, and the timestamp. The transparency log exists so anyone can independently verify the build, including you. See https://github.com/sheaf-project/android/blob/master/docs/VERIFYING.md.

This involves the user's device only if they choose to verify a build before installing it; the app itself does not contact Sigstore at runtime.

5. Permissions the app requests

Permission Why
Internet To talk to your chosen Sheaf instance
Notifications (Android 13+) For the optional fronting-status notification, and for push if you enable it (§4.2)
Biometric / device credential For the optional app-lock feature
Wake lock / receiver permissions For the home-screen widget and Wear OS pairing

The app does not request, and never uses:

6. What the app does not do

7. Where you got the app from

The app's distribution surface affects who sees what:

8. Children

The Sheaf hosted service is not intended for users under 16. The app itself doesn't enforce that — your chosen instance does — but in practice the app is most useful when used with an instance, so the same age guidance applies. See the hosted Terms.

9. Your rights

For data the app stores locally on your device, you control it directly: uninstalling the app removes everything; clearing app storage clears tokens and caches.

For data sent to your chosen Sheaf instance, your rights (access, rectification, erasure, etc. under GDPR / UK GDPR / CCPA / equivalents) are exercised against the operator of that instance, per their privacy policy. If your chosen instance is one of Lupine Systems' hosted instances, see /service/privacy/ §7 — including the universal-policy extension that means we honour those rights for anyone, regardless of jurisdiction.

10. Security

Responsible disclosure of security issues: [email protected], GitHub Security Advisories, or the project's SECURITY.md.

11. Changes

When this policy changes we'll update the Effective date at the top.

For material changes (a new permission requested, a new third party involved, new data collected or sent off the device) we'll also call it out in the release notes for the version that makes the change, on the Play listing and in the GitHub release, and flag it in the app's About section so it's visible to someone who installed before the revision. This policy covers the app binary rather than any particular instance, so it reaches you through the app itself rather than through any instance's mailing list.

If you use one of the Lupine-hosted instances, changes to that service are notified separately, per Terms §14.

12. Contact

Privacy questions, data requests, or complaints: [email protected]. See /legal/ for company details.