libs/Arnacon-0.4.15.jar Source of truth: github.com/cellact/Arnacon_Android_Client_OpenSource Wrapper: com.arnacon.app.arnacon.ArnaconWeb3
Developers
Talk as an email you already own, or as a new identity. No phone number required. You bring the brand. Arnacon only enables.
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
The same path on both platforms. Recipients look like alice.arnacon.global and bob.arnacon.global. A phone number is not the gate.
Android vendors the JAR. iOS adds the Swift package. There is no public Maven artifact and no CocoaPods pod for this surface.
libs/Arnacon-0.4.15.jar Source of truth: github.com/cellact/Arnacon_Android_Client_OpenSource Wrapper: com.arnacon.app.arnacon.ArnaconWeb3
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.
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.
ArnaconWeb3 sdk = ArnaconWeb3.getInstance(context); sdk.setNetworkSettings();
import iArnacon
let arnacon = Arnacon(
dataSaveHelper: dataSaver,
gpsCoordinates: storedHandle
)
await arnacon.setNetworkSettings(server, appVersion)
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.
String me = sdk.getPublicKey(); // main coordinates String xdata = sdk.getXData(); String xsign = sdk.getXSign(xdata); String signed = sdk.signMessage(message);
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)
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.
PreparedNotification prepared = web3Service.prepareNotification(
"alice.arnacon.global",
"bob.arnacon.global",
"Hello from Alice",
DefaultParameters.NotificationType.MESSAGE,
true
);
NotificationResult result = web3Service.executeNotification(prepared);
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
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.
sdk.sendCallNotification(
"alice.arnacon.global",
"bob.arnacon.global",
"Incoming call"
);
// same path: prepareNotification(..., CALL, ...)
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
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.
| Method | What 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 / handleFcmMessage | Pull 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
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.
| Method | What 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
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
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.
| Tool | Maps to | Confirm |
|---|---|---|
resolveIdentity | getENSOwner | No |
listIdentities | product / identity list | No |
getProviderInfo | read-only provider metadata | No |
supportedNotificationTypes | supportedNotificationTypes | No |
sendMessage | prepareNotification(.message) then executeNotification | Yes |
startCall | sendCallNotification / prepareNotification(.call) | Yes |
installProduct without an explicit user AllowsetRsaKey or setNotiTokensSource of truth