chadtmiller.com/knotless
git that lives in your Atmosphere account
1
10
An iOS app reads the inbox, pulls, diffs, repositories and profiles
Merged Approved
This adds a read-only SwiftUI iOS app under ios/, plus an ios workflow. The workflow compiles Models.swift on Linux and decodes the recorded answers in harness/shots/fixtures.json with it. I read the workflow, check-models.sh, ModelCheck, the client, the models, the highlighter, the Markdown parser, App.swift, CodeViews.swift and run.sh. I didn't read the other views, the UI tests, the asset SVGs or project.yml. I found nothing that has to change before it merges.
- Models and check: the checker picks answers by their
/xrpc/dev.knotless.<name>key and requiresstatus == 200. It fails if it reads none, so a moved fixture shape can't pass silently. - Highlighting: the range arithmetic is bounds-checked, and an out-of-range or invalid range is skipped rather than crashing.
- Dev tokens:
DevAccountreads service tokens only from an environment path thatios/run.shsets. The tokens are not in the repository or the app, and.tokens*andbuild/are git-ignored. Before sign-in ships, make sure nothing like this stays reachable in a release build. - Checks: when I looked,
ios,checkandtestwere still running. The others had passed or skipped. This isn't a gate on the approval. - Docs:
AGENTS.mdnow describesios.yml. The change adds nocrates/code, so no changeset is needed.
Two gaps, both already in the body: nothing records a listNotifications answer, so the inbox model isn't covered, and the app itself isn't built in CI.
All checks have passed
8 passed, 2 skipped
Merged as e0c925b
Part of a stack of 6
- An iOS app reads the inbox, pulls, diffs, repositories and profiles
- main
What changes
An iOS app, under
ios/. SwiftUI, iOS 18 and up, no dependencies, its project generated fromios/project.yml. It has Home (starred and own repositories), Inbox, Explore (the activity feed) and Profile tabs, a repository's page with its README and files, its pulls and issues, a pull with its checks, reviews and comments, and its diff, highlighted from the ranges the server already sends. It reads the existing XRPC queries and writes nothing.An
ioscheck. It compiles the app's models on Linux and reads the answers inharness/shots/fixtures.jsonwith them. It runs only on pulls that changeios/, the lexicons or those answers, and no deploy waits for it.The app can't sign in yet. Until the pulls above this one land, the inbox and private repositories work only with service tokens that
ios/run.shmints with goat, which aren't in the repository or the app.Why
The pages work on a phone, but reading an inbox and reviewing a pull is what people do away from a desk, and a native app does it better. The layout follows GitHub's iOS app, as those are the same jobs.
The
ioscheck exists because a model that misreads a field fails a whole screen: two did while this was built (languageandskipped), and each broke several screens. Xcode needs macOS, andknotless-runruns pulls under docker alone, so building the app in CI would take a Mac and a new executor. The models need only Foundation, which is the part most likely to drift from the server.How it was checked
Run in the iPhone 17 Pro simulator on iOS 26.5 against knotless.dev, signed in with service tokens: every screen looked at in light mode, and the inbox, pull and diff in dark.
KnotlessUITestspasses, 3 of 3, tapping from the inbox into a private repository's pull and its diff, and from Home to a repository's files.ios/check-models.shreads all 31 recorded answers of the kinds the app uses.Shortcomings
ios/README.mdhas the commands to run by hand.listNotificationsis recorded, so theioscheck doesn't cover the inbox's model.🤖 Generated with Claude Code