CommonCompute
Get startedDownload the Mac app
Security

Tasks signed, gated, and receipted end to end.

A Common Compute task crosses a lot of trust boundaries — your code, our coordinator, someone else's Mac. Task assignments are signed, every input is vetted at a single chokepoint, and the provider app ships hardened, signed, and notarized. Here is exactly how — including the parts we haven’t built yet.

Read the trust model — what is (and isn't) protected →
01 — Data handling
Your job input is deleted when the job finishes, not 30 days later.

A prompt that ran in four seconds used to sit in storage for a month. Now the input is deleted as soon as the job reaches a terminal state — the router purges it on completion, and a sweep every 15 minutes catches anything that path missed, so nothing depends on the fast path having worked. Results are kept longer for the obvious reason that you still have to fetch them, and are removed by the 30-day sweep; that window is enforced in code, not by policy, and has a floor so a misconfiguration can't collapse it to zero or extend it silently. You can also delete a finished job's payloads yourself at any time with DELETE /v1/jobs/{id}/data. Everything customer-scoped is queried by account: your jobs, devices, and receipts are filtered by your user id on every read, and API keys are stored only as a per-key-salted HMAC, so a database copy on its own doesn't yield a usable key. Large payloads move over a bridge that redeems a short-lived, server-signed token pinned to one exact object — a provider Mac cannot enumerate the bucket or reach another customer's file. One limit worth stating plainly: billing records (amounts, timestamps, job ids — not payloads) are retained beyond all of this because we have to.

02 — Input isolation
Every job input passes a trusted-download gate before a runner touches it.

Job inputs reach the runner only through a single chokepoint that refuses anything except HTTPS to public hosts. Loopback, RFC1918 home networks, AWS metadata addresses, and link-local IPs are rejected — even via redirect, with the destination IP re-validated after each hop. Downloads are magic-byte checked: a runner asking for an image cannot be handed a script. Per-task inputs and outputs are scoped to that task; note that runner processes and loaded model weights are deliberately reused across jobs on a given Mac, which is what keeps warm-start latency low.

03 — Code signing
Developer ID signed, notarized by Apple, and stapled.

The macOS app runs under Apple's hardened runtime and ships signed with our Developer ID, notarized by Apple, with the notarization ticket stapled to the disk image — so it installs without a Gatekeeper warning. Every Sparkle update is additionally EdDSA-signed with a private key we hold; your Mac refuses any update that doesn't verify against the public key baked into the shipped binary.

04 — Network posture
Outbound network only. No listeners, no plaintext.

The provider app declares `com.apple.security.network.client` for outbound calls — there is no `network.server` entitlement and no listener anywhere in its source, and no camera, microphone, or contacts entitlements exist at all. Being precise about what that buys: the app is not App-Sandboxed, so those absences are choices we made and can be audited on, not boundaries the OS enforces. (One further entitlement, `disable-library-validation`, exists solely so Sparkle's separately-signed updater helpers can load under hardened runtime; it is compensated by EdDSA verification on every update.) All outbound traffic is TLS 1.2+. The blanket ATS exemption present in pre-1.5 builds is gone.

05 — Task signing
Every task assignment is Ed25519-signed and verified on-device.

The router signs each task assignment with Ed25519. Your Mac refuses anything that doesn't verify against the pinned public key, with a 5-minute clock-skew window and replay protection. On completion we settle billing against the recorded result, and every completed job gets a receipt — input and output hashes plus the price — which you can fetch from `GET /v1/jobs/:id/receipt`. To be precise about what that receipt is: it carries a platform signature (HMAC-SHA256 with a key we hold), so it proves the record came from us and has not been altered, but it is not a third-party-verifiable proof and it is not signed by the provider's Mac. Per-device provider signatures are built but not yet shipped.

06 — Secrets at rest
Session tokens require an unlocked screen, never sync to iCloud.

Your session token lives in the macOS Keychain under kSecAttrAccessibleWhenUnlockedThisDeviceOnly — physically inaccessible to anything running while the screen is locked, and never synced via iCloud Keychain. Existing entries from older builds were upgraded automatically on first launch of 1.5.0.

07 — Model integrity
Models loaded through ModelManager are hash-pinned and verified byte-for-byte.

Model bundles fetched through ModelManager carry an expected SHA-256 in our manifest. The Mac hashes every byte after download and refuses to load anything that doesn't match — and refuses to load at all if the manifest has no hash for that model, rather than falling back to unverified bytes. Two honest limits: the manifest itself is not yet signature-verified on-device (a signing key is provisioned but the unsigned path is still accepted during alpha), and several runners load weights through their own framework's downloader rather than ModelManager, so those bytes are not hash-pinned. Closing both is tracked work, not a shipped guarantee.

Vulnerability disclosure

Found something? Tell us.

Email security@commoncompute.ai with a description and steps to reproduce. We acknowledge within 7 calendar days and aim to ship a fix within 30 days for high-severity issues.

We don't run a paid bounty yet, but we publish a researcher hall of fame for valid reports. Good-faith research is welcome — don't access another user's data, don't degrade the service for others, and give us 90 days before publishing.

Coordinated disclosure policy in full: SECURITY.md

Subprocessors

Who else touches your data.

Cloudflare
DNS, CDN, edge compute (Workers), R2 object storage, transactional email
US/Global
Apple
Notary service for macOS app signing
US
Stripe
Customer billing and provider payouts (Stripe Connect, weekly)
US/EU
Provider operators
Task execution on independently-owned Apple Silicon Macs — the assigned machine sees your input in plaintext
US (self-attested)
Compliance — where we are, honestly

We'd rather be upfront than fake a certification.

Planned
SOC 2 Type II
Targeting Q1 2027 — once we have 6 months of mature ops to audit. We aren't a fly-by-night shop, but we also won't pre-sell a certification we don't have.
Planned
External penetration test
Scoped for after the v1.7 release. Results will be posted here in summary form once remediation lands.
Active
Internal red-team
v1.5.0 was a top-to-bottom hardening pass against a real adversary model. The release notes list every closed vector.

Questions we didn't answer here?

We answer security questionnaires by hand. Get in touch and we'll route to whoever owns the answer.

security@commoncompute.aiRead the isolation docs