Privacy Policy

Effective: 2026-08-27. SkyTwin is an open-source personal automation project. This policy describes how the SkyTwin desktop app handles Google and Microsoft user data accessed via their respective APIs.

Summary: SkyTwin runs entirely on your computer. By default — using the built-in on-device language model — your Google data (emails, calendar events, profile information) never leaves your machine. We do not operate servers that hold your user data; the SkyTwin developers cannot access it. The one exception is opt-in: if you enable a cloud AI provider (Anthropic, OpenAI, or Google AI) in Settings for sharper reasoning, the content of each decision SkyTwin reasons about is sent to that provider for processing — see AI providers below. Nothing is shared with a cloud provider unless you turn it on. Local does not mean encrypted: your twin profile, preferences, and memory are stored unencrypted in a database on your own disk today — please turn on full-disk encryption. See How we store and protect your data for exactly what is and is not encrypted.

Who we are

SkyTwin is developed by Jay Zalowitz, an independent open-source contributor. Source code, including the entirety of the data-handling implementation, lives at github.com/jayzalowitz/skytwin under the Apache 2.0 license. There is no SkyTwin Inc., no cloud product, and no centralized data store. Contact: open an issue at github.com/jayzalowitz/skytwin/issues.

What Google user data we access

Which Google scopes SkyTwin can request depends on which OAuth client is in use. There are two tiers, and the difference matters:

Tier 1 — the bundled SkyTwin OAuth client (the default)

A fresh desktop install uses an OAuth client owned by the SkyTwin project. That client is registered for identity and Calendar scopes only. It cannot request Gmail access — the code path that builds the authorization URL refuses to add Gmail scopes for the bundled client (resolveRequestedScopes in apps/api/src/routes/oauth.ts). The scopes it requests are:

That is the complete list for the default install. If you never supply your own OAuth credentials, SkyTwin never asks Google for access to your mail.

Tier 2 — your own Google OAuth client (bring-your-own, required for Gmail)

Gmail's readonly and modify scopes are restricted scopes under Google's policy. Rather than put restricted scopes on a shared, project-owned client, SkyTwin requires you to create an OAuth client in your own Google Cloud project and paste its credentials into Setup (see Connect Gmail). Only then, and only if you explicitly opt in to Gmail during the connect flow, does SkyTwin additionally request:

In this tier the OAuth client is yours; the grant is between you and Google, and the tokens are stored on your own machine exactly as described below.

Microsoft (Outlook) data we access

SkyTwin can also connect Outlook mail and calendar via Microsoft Graph. There is no bundled Microsoft client — connecting Outlook means registering your own Microsoft Entra application and supplying its credentials, the same bring-your-own model as Tier 2 above. The Graph scopes requested are:

The Outlook integration is read-only: SkyTwin does not request write scopes for Microsoft mail or calendar, so it cannot send Outlook mail or modify Outlook events. Microsoft user data is stored, used, and deleted on exactly the same terms as Google user data throughout this policy.

How we use Google user data

SkyTwin uses Google user data exclusively to provide the user-facing personal-assistant features visible in the SkyTwin desktop app. Specifically:

SkyTwin does not use Google user data for advertising, model training across users, lending decisions, or any purpose other than the personal-assistant features described above.

How we store and protect your data

All data accessed via Google APIs — both raw API responses and any derived signals, decisions, preferences, and twin profile records — is stored exclusively in a CockroachDB database that runs locally on the device where SkyTwin is installed. The database files live in your operating-system-standard application data directory:

Those files are protected by your operating system's normal file permissions — the same protection as the rest of your home directory. There is no additional SkyTwin-managed encryption layer over them by default.

Turn on full-disk encryption. The single most effective thing you can do to protect the data SkyTwin stores is to enable your operating system's full-disk encryption: FileVault on macOS, BitLocker on Windows, or LUKS/dm-crypt on Linux. That is what actually protects your SkyTwin database if your machine is lost or stolen or its disk is imaged. We recommend enabling it before you connect an account.

OAuth tokens: encryption is available, and opt-in

SkyTwin ships a credential vault (@skytwin/credential-vault) that encrypts stored OAuth access and refresh tokens with AES-256-GCM, using a per-user key derived from a passphrase via scrypt. The key is derived on your device and never leaves it. We would rather be precise than reassuring about what this covers today:

What is not encrypted today

Your learned preferences (the preferences table), your twin profile (the twin_profiles table — inferences, communication style, risk tolerance, spend norms, routines, domain heuristics), and the textual memory the twin extracts from your correspondence (the brain_pages table — titles, body content, and metadata) are currently stored unencrypted in your local CockroachDB. The same is true of the derived search fields computed from them: the full-text index (content_tsv) and the semantic vector (embedding).

A column-level encryption schema and helpers for those three tables exist in the repository (migration 066-encrypt-high-value-tables.sql and packages/db/src/lib/vault-helper.ts), but they are not yet activated by any shipping code path — no running process supplies the vault key to them, so they operate in plaintext mode. Switching them on is tracked as issue #374. This page will be updated when that ships. Until then, treat those tables as readable by anyone who can read the files on your machine, and rely on full-disk encryption.

Telemetry and crash reports

SkyTwin runs no analytics and collects no usage telemetry. No Google user data, no derived twin data, and no message or calendar content is ever sent to the SkyTwin developers or to any SkyTwin-operated server. The one exception is a cloud AI provider that you configure yourself — see Data sharing & transfers below, where prompts containing your data go to whichever provider you chose (including Google AI, if that is the one you picked). The default install makes no such calls.

The desktop app includes one optional, default-off diagnostic: “Send anonymous crash reports” in Settings. When — and only when — you turn it on, an unhandled crash uploads a small JSON report to https://crash.skytwin.dev/api/desktop/report containing the exception type, the error message, the stack trace, the app version, and your OS platform and CPU architecture. The message and stack are scrubbed before upload (redactPii in apps/desktop/src/crash-reporter.ts) to remove email addresses, home-directory paths, Bearer credentials, api_key= / token= / secret= / password= values, and bare keys carrying a recognizable vendor prefix (sk-, ghp_, xoxb-, AIza, and similar). Scrubbing is pattern-based, so a secret in an unrecognized format could still appear in a stack trace — which is part of why the setting is off by default. The report carries no account identifier, no signal or memory content, and no twin profile data. Leaving the setting off means no crash report is ever sent.

Data sharing & transfers

SkyTwin does not transfer Google user data to any third party for the developers' benefit — there is no analytics, advertising, model-training, or data-broker pipeline, and no SkyTwin-operated server ever receives it. The only network connections the app makes with your Google data are the ones below; note that item 2 (an optional, opt-in cloud AI provider you enable) is the single case where decision content is sent to a third party, and only then:

  1. Direct API calls from the SkyTwin desktop process to the provider's own API servers (e.g. gmail.googleapis.com, calendar.googleapis.com, graph.microsoft.com) to fetch the data you authorized and carry out approved actions, including Gmail label/archive operations, Gmail sends, and calendar changes.
  2. Optional outbound calls to LLM providers (OpenAI, Anthropic, Google AI) only if you have configured one of those in Setup — the prompts may contain your data, in which case that provider's terms apply. The default install uses the embedded llama.cpp runtime and makes no outbound LLM calls.
  3. Provider order is local-first by default for the env-driven factory (#375 — partial). The shared LLM client constructed from environment variables (used today by capability suggestions and any future caller that goes through getLlmClientFromConfig) now orders local providers (embedded llama.cpp, Ollama) ahead of cloud providers (Anthropic, OpenAI, Google) by default. A cloud key in your env no longer silently escalates that path to cloud-as-primary. Set SKYTWIN_LLM_PRIORITY=cloud-first on the API process to put cloud providers ahead of local — that's an explicit consent gate and the env var is the audit trail.

    Scope note: the decision-ingest path (the one that actually sends your email / calendar prompts to an LLM) constructs its provider chain from the per-user ai_provider_settings table, ordered by the per-row priority column. That path is NOT changed by this update; the user-facing toggle UI that unifies both ordering paths is tracked as a follow-up to the same issue. Until that ships, configure ai_provider_settings.priority via Settings to control your decision-pipeline ordering.

Separately from the list above, the desktop app can send an anonymous, PII-scrubbed crash report to crash.skytwin.dev if — and only if — you turn that default-off setting on. Crash reports contain no Google or Microsoft user data; see Telemetry and crash reports for the exact contents.

We do not sell user data. We cannot sell user data — we do not possess it.

Human access to your data

The SkyTwin development team has no operational mechanism to read your Google or Microsoft user data. The data lives on your device, in files owned by your operating-system user account. The only people who can read it are:

Limited Use compliance

SkyTwin's use of information received from Google APIs adheres to the Google API Services User Data Policy, including the Limited Use requirements. Specifically:

Your controls

Children

SkyTwin is not designed for or directed at children under 13. We do not knowingly collect data from children.

Changes to this policy

Material changes will be announced in the project CHANGELOG on GitHub (CHANGELOG.md) and reflected here. This page is versioned in git alongside the source code; previous revisions are available in the repository history.

Contact

Privacy questions, security disclosures, or data-handling concerns: open an issue at github.com/jayzalowitz/skytwin/issues or, for security-sensitive matters, follow the disclosure process described in SECURITY.md.