Developers

Get started.

Talk as an email you already own, or as a new identity. No phone number required. You bring the brand. Arnacon only enables.

Swift · iArnacon Android · JAR 0.4.15 No number required

This page is the store SDK. It tracks the live Arnacon apps and will update. A separate shell is not the Arnacon product — do not treat it as this SDK.

Five steps

Install. Init. Identity. Message. Call.

The same path on both platforms. Recipients look like alice.arnacon.global and bob.arnacon.global. A phone number is not the gate.

1 Install 2 Init 3 Identity 4 First message 5 First call

1. Install

Android vendors the JAR. iOS adds the Swift package. There is no public Maven artifact and no CocoaPods pod for this surface.

AndroidJAR 0.4.15
libs/Arnacon-0.4.15.jar

Source of truth:
github.com/cellact/Arnacon_Android_Client_OpenSource

Wrapper:
com.arnacon.app.arnacon.ArnaconWeb3
iOSSPM · iArnacon
In Xcode: File → Add Package Dependencies…
Add the iArnacon package used by
github.com/cellact/arnacon-swift

Product name: iArnacon
Platform: iOS 13+
No CocoaPods. Do not invent a version pin
that is not on the package.

2. Init

Create the SDK, then set network settings. You supply a data-save helper. The second iOS argument is the app’s stored coordinates handle — wiring, not a phone number. No API key.

AndroidArnaconWeb3
ArnaconWeb3 sdk = ArnaconWeb3.getInstance(context);
sdk.setNetworkSettings();
SwiftArnacon : AArnacon
import iArnacon

let arnacon = Arnacon(
    dataSaveHelper: dataSaver,
    gpsCoordinates: storedHandle
)
await arnacon.setNetworkSettings(server, appVersion)

3. Identity — email or new

People talk as an email they verify, or as a new identity they create. Store apps mint {label}.arnacon.global via ITEM. Call and message those names. Wallet signing and SIP headers sit under this — they are not the product.

Android
String me = sdk.getPublicKey(); // main coordinates
String xdata = sdk.getXData();
String xsign = sdk.getXSign(xdata);
String signed = sdk.signMessage(message);
Swift
let me = arnacon.getMainCoordinates()
let owner = try await arnacon.getENSOwner(
    memberName: "alice.arnacon.global"
)
let xdata = arnacon.getXData(identity: "alice.arnacon.global")
let xsign = try arnacon.getXSign(xdata)
let signed = try arnacon.signMessage(message)

4. First message

Prepare, then execute. NotificationType.MESSAGE = 1. Do not use a plaintext helper as the entry. The Android store wrapper’s sendFCMMessage is the same path (prepare + execute) if you already have the wrapper.

Android · JAR
PreparedNotification prepared = web3Service.prepareNotification(
    "alice.arnacon.global",
    "bob.arnacon.global",
    "Hello from Alice",
    DefaultParameters.NotificationType.MESSAGE,
    true
);
NotificationResult result = web3Service.executeNotification(prepared);
Swift
let prepared = await arnacon.prepareNotification(
    sender: "alice.arnacon.global",
    target: "bob.arnacon.global",
    message: "Hello from Alice",
    notificationType: .message
)
let result = await arnacon.executeNotification(prepared)
// or sendNotification(...) in one step

5. First call

Ring the other identity. NotificationType.CALL = 0. The SDK prepares identity and the call notification. CallKit lives in the store app, not in the Swift SDK. Your app’s call stack takes it from there.

Android
sdk.sendCallNotification(
    "alice.arnacon.global",
    "bob.arnacon.global",
    "Incoming call"
);
// same path: prepareNotification(..., CALL, ...)
Swift
let ringing = try await arnacon.sendCallNotification(
    sender: "alice.arnacon.global",
    target: "bob.arnacon.global"
)
// or prepareNotification(..., notificationType: .call)

Push tokens so a device can ring: iOS sendNotiTokens(fcm, voip). Android sendFcmToken. Register the user’s own device. Do not push tokens for someone else.

installProduct adds an identity. Live Android still auto-installs from FCM ITEM with no dialog. The intended policy — implement this, and what MCP will require — is that the user Allows. Never auto-run it in new code.

Java / Android

Vendored JAR. Store wrapper.

Not Maven. Ship Arnacon-0.4.15 with the app. The live open wrapper is com.arnacon.app.arnacon.ArnaconWeb3 in cellact/Arnacon_Android_Client_OpenSource. The JAR type behind it is org.Arnacon.

MethodWhat it does
getInstance(ctx)Singleton wrapper for the vendored JAR.
setNetworkSettings()Connect the running server config. Call after init.
getPublicKey()Main coordinates for this install (not a phone number).
getXData() / getXSign(data)Identity headers used when the app registers to call.
signMessage(message)Sign a payload with the install’s key. Never log the key.
prepareNotification(...)JAR: build a MESSAGE (1) or CALL (0) plan without sending.
executeNotification(prepared)JAR: send a prepared plan.
sendFCMMessage(local, remote, message)Wrapper convenience: prepare MESSAGE, then execute.
sendCallNotification(local, remote, message)Wrapper convenience: prepare CALL, then execute.
sendFcmToken(token)Register this device’s push token.
fetchMessages / handleFcmMessagePull or accept inbound payloads. Do not install from them.
installProduct(item)Add an identity. Live Android store auto-installs FCM ITEM today. Intended policy: user Allows.
checkIdentity(label)True if that label is already on this device.

Identities after ITEM are {label}.arnacon.global, not a raw 0x address. Email as a talk-as identity is a store-app path. WhatsApp is not required.

Swift / iOS

SPM product iArnacon.

Used by the store app at cellact/arnacon-swift. Add the package by repository URL in Xcode. Product name iArnacon. iOS 13+. No CocoaPods. Class Arnacon : AArnacon. CallKit is the store app, not this SDK.

MethodWhat it does
init(dataSaveHelper:gpsCoordinates:)Create the SDK with your data-save helper.
setNetworkSettings(_:_:_:)Connect the running server config. Call after init.
getMainCoordinates()Main coordinates for this install.
getENSOwner(memberName:forceFresh:)Resolve an identity name to its owner.
getXData(identity:) / getXSign(_:)Identity headers used when the app registers to call.
signMessage(_:)Sign a payload. Never expose the mnemonic or key.
prepareNotification(sender:target:message:notificationType:)Build a MESSAGE or CALL plan.
executeNotification(_:)Send a prepared plan.
sendNotification(...)Prepare and execute in one step.
sendCallNotification(sender:target:)Preferred one-shot for a call.
sendFCMMessage(sender:target:)One-shot message notification when you already have the plan path.
sendNotiTokens(_:_:)Register this device’s FCM and VoIP tokens.
supportedNotificationTypes(sender:)Which types this identity can send.
getProductsList() / getProductLabels()Identities installed on this device.
installProduct(_:)Add an identity. Intended policy: user Allows. Do not auto-run from FCM in new code.
isEmailIdentity(_:) / writeEmail(_:)Store-app email identity only. Not required to call.

Notification types: CALL = 0, MESSAGE = 1. Recipients: alice.arnacon.global, bob.arnacon.global, or an email. A phone number is not required.

JavaScript

No public calling SDK.

Open the native Arnacon app, or pair a browser through the ArnaconWeb companion.

Native-bridge pairing only. There is no first-call JavaScript snippet on this page.

When a public JS calling surface exists, this section will show it. Until then, use Swift or Android.

For AI

Proposed MCP. Not a live server.

This is a spec on the preview. A live MCP host is not up yet. The machine-readable file is mcp.json. Auth: the user must already have an Arnacon identity. Never expose a mnemonic or private key. Payments stay human.

Writes (message, call) need an explicit confirm. Read-only tools do not.

ToolMaps toConfirm
resolveIdentitygetENSOwnerNo
listIdentitiesproduct / identity listNo
getProviderInforead-only provider metadataNo
supportedNotificationTypessupportedNotificationTypesNo
sendMessageprepareNotification(.message) then executeNotificationYes
startCallsendCallNotification / prepareNotification(.call)Yes
Never, over MCP:
  • Mnemonic or private keys
  • Payments or store checkout
  • installProduct without an explicit user Allow
  • setRsaKey or setNotiTokens
  • Send as another identity
  • WhatsApp opt-in

Source of truth

Repos this page tracks.