Skip to content
xcross
Documentation menu

Authentication

Sign in with an Apple ID or an App Store Connect API key so xcross can sign apps for your device.

xcross signs and provisions in-process, for Flutter and Compose alike. Pick one method.

xcross auth --apple-id you@example.com
# prompts for password + 2FA code

Which one?

Apple ID
API key
Free account works
No prompts (CI)
App Groups managed for you
Stored on disk
session token only
IDs + .p8 path

ImportantUse a separate Apple ID, not your main one. xcross signs in via a non-standard path, and a throwaway free account costs nothing.

How the session is chosen

Apple ID sessionwins when valid
API keyused otherwise

Saving an API key clears any Apple ID session. xcross auth clean removes everything: the key, the Apple ID session and every certificate, private key and profile xcross minted. The downloaded ADI libraries stay. (auth clear was renamed in 2.0.)

Working offline

Apple is only needed to provision: the first run of an app on a device, or when something about it changes. After that, flutter run and compose run keep working without a network.

First runonline: App ID, certificate, profile
Cachedcertificate + profile saved for that app
Later runsApple unreachable or session expired: sign from the cache
XCROSS_OFFLINE=1 xcross flutter run   # skip Apple entirely, even when online

Offline signing still needs, for that app and device:

  • one earlier online run, so a profile is cached
  • a profile that lists the device and hasn’t expired (7 days on free accounts)
  • no new extension, capability or App Group since then

If one is missing, xcross says which and asks you to reconnect once. A dead network can’t stall the run: the Apple ID access check gives up after 20 seconds.

App ID

On an app’s first device build, xcross asks whether to register the original bundle id or an XCR- prefixed one and saves it as bundle_id in pubspec.yaml (or xcross_project.yaml). Pick original for Sign in with Apple, push, passkeys and associated domains. See CLI reference.

Remote Anisette

Apple’s GrandSlam login expects Mac-matching machine attestation (anisette). By default xcross auth uses a remote Omnisette v3 server (https://mac-ani.jkcoxson.com) that synthesizes those headers.

Apple GSAwants Mac anisette identity
Omnisettesynthesizes matching headers
xcross authdefault server, or --anisette-url
Signed insession saved for provisioning
xcross auth --apple-id you@example.com
# uses https://mac-ani.jkcoxson.com

Self-host omnisette-server if you don’t want a public relay. The chosen URL is stored with the session so later signing hits the same backend (override with XCROSS_ANISETTE_URL).

ImportantA public Omnisette server is a third party you trust with device identity material. Your Apple ID password and 2FA code are still sent only to Apple. Prefer a secondary Apple ID, or run your own server.

Public servers

Mac Omnisette servers from SideStore’s public directory — these work with --anisette-url (and as alternatives to the default).

ADI libraries

--adi-library-dir is a legacy opt-in to local Android ADI libraries (libCoreADI.so, libstoreservicescore.so). Apple currently rejects that identity (-80046); prefer the Omnisette default above. On Windows / Linux (x64 or ARM64) the matching slice still downloads automatically when you force this path.

NoteYour password is never stored.

NameURL
jkcoxson
https://mac-ani.jkcoxson.com
Lill q
https://anisette.lillq.me
SideStore (New)
https://new.ani.sidestore.io

Mac Omnisette servers from servers.sidestore.io · refreshed at build (2026-10-26)

ESC