| name | ios-app |
| description | Build and maintain the native iOS client inside this turborepo (XcodeGen, SwiftUI, WebSocket feed). Use when creating/updating the iOS app, wiring turbo tasks, or documenting iOS workflows. |
iOS App Skill (Highswarm Feed)
This repo includes a native iOS app at apps/ios/ built with XcodeGen.
Purpose (v0)
- Tokenless, read-only feed.
- Connect to the firehose WebSocket and render the full stream in a SwiftUI list.
- Dense "TUI" theme (max info density, small fonts, stacked rows).
- Geist Pixel font (bundled under
HighswarmFeed/Resources/Fonts/).
- CarPlay mirror (shows the same feed using the same underlying socket/state).
- Keep the iOS workflow reproducible inside the turborepo.
Paths
- App:
apps/ios/
- XcodeGen spec:
apps/ios/project.yml
- Sources:
apps/ios/HighswarmFeed/
- Tests:
apps/ios/HighswarmFeedTests/
- Font resources:
apps/ios/HighswarmFeed/Resources/Fonts/
Server API Facts (Current)
- Default base URL:
https://agent-network.joelhooks.workers.dev
- Firehose WS endpoint (raw, tokenless for now):
wss://.../firehose (aliases to /relay/firehose).
- Sanitized public stream still exists at:
wss://.../relay/public-firehose.
Workflow
Generate the project:
cd apps/ios
pnpm gen
Open in Xcode:
cd apps/ios
pnpm open
Build + test from CLI (uses installed iOS 26.2 simulator runtime):
cd apps/ios
pnpm ios:test
Run it in the Simulator (fast loop, no Xcode needed):
pnpm ios:build
APP=$(ls -d ~/Library/Developer/Xcode/DerivedData/HighswarmFeed-*/Build/Products/Debug-iphonesimulator/HighswarmFeed.app | head -n 1)
UDID=$(xcrun simctl list devices available | rg "iPhone 17 \\(" | head -n 1 | sed -n 's/.*(\\([0-9A-F-]\\{36\\}\\)).*/\\1/p')
open -a Simulator
xcrun simctl bootstatus "$UDID" -b
xcrun simctl install "$UDID" "$APP"
xcrun simctl launch "$UDID" com.joelhooks.highswarm.feed
Turborepo Integration
apps/ios includes a package.json so pnpm/turbo can run scripts:
pnpm --filter @atproto-agent-network/ios ios:test
We intentionally avoid naming these scripts build/test so turbo build / turbo test
doesn't start running Xcode builds when you're just shipping the Workers app.
Keeping It Updated
When the network event payload shape changes (especially event_type, timestamp, and context fields):
- Update the Swift decoder in
apps/ios/HighswarmFeed/Models.swift
- Update normalization logic in
apps/ios/HighswarmFeed/EventNormalizer.swift
- Add/adjust tests in
apps/ios/HighswarmFeedTests/EventNormalizerTests.swift
CarPlay Notes
- CarPlay UI lives in
apps/ios/HighswarmFeed/CarPlaySceneDelegate.swift.
- We intentionally reuse
SharedStores.shared so CarPlay does not open a second WebSocket.
- CarPlay policies/entitlements are a future problem; this is intended for local/simulator testing while iterating.