Skip to content

Hub app skeleton: generated API client, shell and first screens - #1

Merged
Adron merged 1 commit into
mainfrom
feature/app-skeleton
Oct 23, 2026
Merged

Adron merged 1 commit into
mainfrom
feature/app-skeleton

Conversation

@Adron

@Adron Adron commented Oct 23, 2026

Copy link
Copy Markdown
Member

First build-out of the iOS/iPadOS Substratal Hub, management sections first.

What's in it

  • SubstratalKit (Swift package, shared with a future macOS app)
    • SubstratalAPI: the client generated at build time from openapi.yaml 1.0.0-draft.9 (124 operations)
    • SubstratalCore:
      • middleware that sends Substratal-Version: 1 on every request. There's no /v1 in any URL.
      • Deprecation/Sunset handling and the unsupported_api_version blocker
      • auth with single-flight refresh, error mapping, and Idempotency-Key / If-Match
      • session, Keychain, Capabilities, all 75 screen routes, and help-center links
    • SubstratalUI: the 5 light and 5 dark themes from the spec, StatusBadge, IDChip, AccessRow, SecretRevealSheet, and load/error states
  • App
    • Layout: iPhone tabs (Manage is hidden without rights), the iPad sidebar, and deep links (substratal:// and dashboard URLs)
    • Working screens:
      • Sign-in and two-factor
      • Home, Account, and Settings appearance
      • Users and user access, Roles, and the Audit log
      • Applications, and API keys with the one-time secret reveal
    • Every unbuilt screen resolves to a placeholder that links to its spec and its help page.
  • Demo mode (-demo YES, plus -autoSignIn YES and -route <path>) for running without an account
  • Scripts: sync-openapi.sh and derive-openapi.py (open enums, nullable fields, version header via middleware), and generate-screen-ids.py
  • Workflows:
    • CI: project drift check, unit tests, and UI smoke test
    • A daily API-contract sync that opens a PR when the contract changes
    • A help-center rebuild dispatch to the specs repo
  • Docs: the plan is updated for header versioning, and the API gaps map to the [api-gaps] issues

Tested locally

  • swift test: 13 tests pass (routing, versioning middleware, contract pin, status mapping).
  • UI smoke test passes on iPhone 17 Pro (iOS 26.5): sign-in → two-factor → shell.
  • Checked manually in the simulator: sign-in, Manage, and API keys on iPhone; a user-detail deep link on iPad Pro 13".

Not verified

  • CI hasn't run yet. ios.yml assumes a macos-26 runner with Xcode 27 at /Applications/Xcode_27.0.app.
  • docs-dispatch.yml needs the SPECS_DOCS_TOKEN secret. Without it, the workflow logs a warning and the help center still picks up changes on its daily build.

Not built yet

  • Saving access-switch changes (ACX-03) and the remaining forms
  • Push (blocked on API issues #24 and #25)
  • Biometric lock, widgets, and App Intents

🤖 Generated with Claude Code

…t screens

- SubstratalKit package: client generated from the vendored openapi.yaml
  (1.0.0-draft.9, 124 operations), with middleware for Substratal-Version
  (no /v1 in URLs), auth with single-flight refresh, error mapping and
  idempotency; session, Keychain, Capabilities, all 75 screen routes,
  theme and shared components.
- App: iPhone tabs with Manage hub, iPad sidebar, deep links, sign-in
  with two-factor, Home, Account, Settings appearance, Users, user
  access, Roles, Audit log, Applications, API keys with one-time secret
  reveal. Unbuilt screens resolve to spec/help placeholders.
- Demo mode (-demo YES) for running without an account.
- scripts: contract sync/derivation (open enums, nullable fields, header
  via middleware) and screen registry generation from the specs.
- CI (build, unit and UI tests, project drift), daily contract sync PRs,
  and help center rebuild dispatch.
- docs: plan updated for header versioning; API gaps mapped to the API
  repo's [api-gaps] issues.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Adron
Adron merged commit 674494b into main Oct 23, 2026
1 check failed
@Adron
Adron deleted the feature/app-skeleton branch October 23, 2026 23:12
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