Skip to content

feat(mero-models/mobile-ios): native iOS app on Calimero 1.0 (mobile only, web app untouched) - #684

Open
frdomovic wants to merge 2 commits into
mainfrom
feat/mero-models-ios-core-1.0
Open

frdomovic wants to merge 2 commits into
mainfrom
feat/mero-models-ios-core-1.0

Conversation

@frdomovic

@frdomovic frdomovic commented Oct 30, 2026 •

Copy link
Copy Markdown
Member

What and why

Calimero core 1.0 removed /admin-api, /jsonrpc, relays, delegated execution and mero-auth. Clients now talk to attested cluster nodes over the sealed channel and sign in with passkeys. This PR moves the iOS Mero Models app onto swift-sdk's 1.0 port. Android, the web app/ and logic/ are untouched.

  • SDK pin: swift-sdk is pinned to 6c5f1167d1e586f556f59c326de5f51d034e80dd, the head of feat/calimero-1.0 (swift-sdk#85). The pin is set in project.yml and ModelsCore/Package.swift. The pin moves to the merge commit once swift-sdk#85 lands.
  • Sign-in:
    • It uses a passkey on the studio's cluster (MeroAppSession.signIn()), with "Create an account" for signUp(name:). The session lives in the Keychain and is refreshed at launch.
    • "Choose your cluster" / "Change" takes a node URL and a Development cluster switch, which sets allowMock for merod local. On such a node the app keeps a soft passkey and creates the account on first sign-in.
    • The cluster can also be set in project.yml with MeroNodeURL, MeroNodes and MeroAllowMock. The wallet, Cloud-manager and registry keys are gone.
  • Vocabulary: studios are organizations and scenes are app instances, either org-wide or in a team. Code comments and the ids under "About this scene" use the 1.0 words.
  • Invitations:
    • Links keep the same URL and the {invitation, namespaceId, contextId} keys.
    • The payload is now swift-sdk's OrgInvitation: invitation is the inv_… token string. A pre-1.0 signed invitation is refused.
    • Joining redeems the token with POST /invites/{token}/redeem.
  • Blobs: meshes and textures are read with MeroAppBackend.getBlob (/apps/{app}/blobs) instead of the removed client.admin.
  • Approvals:
    • A new "Needs your approval" section on the studios list shows the pending node releases and app upgrades that are the account's to decide, for its own apps and for each studio.
    • "Review" opens the node's consent page in the system browser (MeroAppSession.requestConsent), which returns to mero-models://consent.
    • The logic is ApprovalsModel in ModelsCore.
  • Errors: the typed 1.0 errors read as words, including ReleaseDeadlineError, NotFound, LoginRequired, WrongNode, UnavailableError and AppError.
  • Docs: the mobile README's iOS parts describe the pin and the 1.0 flow.

Verification

  • swift test --package-path ModelsCore on macOS: 21 tests pass. They run on InMemoryAppBackend and cover the invite-link round trip, approvals built from node-shaped reports, the consent flow, and the error text.
  • xcodegen generate, then xcodebuild build -destination 'generic/platform=iOS' CODE_SIGNING_ALLOWED=NO: BUILD SUCCEEDED, with no warnings in app sources.
  • No simulator was used, and nothing ran against a live cluster or end to end.

Gaps

  • Associated Domain: passkeys on a real cluster need the webcredentials:<rp-id> Associated Domain. The cluster's rp-id isn't known yet, so it isn't set. The README notes it.
  • Android and web interop: the Android app still speaks 0.x, and so does the web studio until mero-react is ported. Until then, links minted on iOS don't open there, and the reverse.
  • Demo mode: the app has no demo mode, so there was nothing to keep.

🤖 Generated with Claude Code

frdomovic and others added 2 commits October 30, 2026 13:43
Pin swift-sdk to the head of its Calimero 1.0 branch (a1ec644, PR #85)
and adapt the iOS app:

- Passkey sign-in and account creation on the studio's cluster, with a
  node-URL path (and mock attestation for `merod local`).
- Studios are organizations, scenes app instances; invitation links
  carry an org invite token.
- Blobs through MeroAppBackend.getBlob instead of the removed admin
  surface.
- Pending node releases and app upgrades shown under "Needs your
  approval", decided on the node's consent page in the system browser.
- Typed 1.0 errors in words; tests and README updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Calimero 1.0 branch moved: OrgInvitation is now the link payload
itself ({invitation: "inv_…", namespaceId, contextId?, name?}) and
MeroAppSession.requestConsent takes a ConsentRequest. Adapt the
invitation codec, the consent glue and the tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@frdomovic frdomovic changed the title feat(mero-models-ios): run on Calimero 1.0 feat(mero-models/mobile-ios): native iOS app on Calimero 1.0 (mobile only, web app untouched) Oct 30, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant