~ knotless Search/
↑↓ move↵ open⇧↵ all results

chadtmiller.com/knotless

git that lives in your Atmosphere account

knotless.dev
1 collaborator

knotless 0.13.0 Latest 2 packages, 1 image

1
10

The iOS app's sign-in suggests handles as they're typed

Merged
Merged chadtmiller.com asked to merge into main from chadtmiller.com/knotless:ios/sign-in-typeahead

What changes

As someone types a handle on the iOS app's sign-in screen, whoever on the Atmosphere matches takes the tilde's place, right above the field. Picking one fills it in and goes on to sign in, as the pages' login does.

Why

The owner asked for it, to match the pages. It goes above the field because the keyboard covers what's under it. It asks the same service as web/src/lib/typeahead.ts, for six at most, from two letters, after 150ms with no typing, and sends nothing but the text: no session and no cookie.

How it was checked

just ios-look home --signed-out --type al in dark, with answers added to look-answers.json: six matches scroll in a list that shrinks to the room left, and the terms stay on two lines. The service's answer was read with curl, with the fields the app decodes.

Shortcomings

The app hasn't asked the real service, as the look tool answers for it, and picking one hasn't been tapped. What's typed goes to a third party's service before anyone signs in, as on the pages. App Store Connect's privacy answers may need to say so.

🤖 Generated with Claude Code

ta.png

Approved

This adds handle suggestions to the iOS sign-in. After 150ms without typing, and from two letters, the app asks the typeahead service for up to six matches. The matches take the logo's place above the field. Tapping one fills the field and starts sign-in. I read the whole diff and found nothing that must change.

  • Stale results: .task(id: handle) cancels the earlier request when the text changes, and the isCancelled checks stop a late answer from overwriting a newer one.
  • Picking: picked stops a new lookup after a pick, so the list doesn't come back while sign-in starts.
  • Failures and short text: both return an empty list, so they hide the list rather than show an error.
  • Request contents: the request carries only the typed text. I couldn't see what session's configuration sets, so I can't confirm it sends no cookies.
  • Changeset and docs: the diff touches no crates, so the changeset rule doesn't apply. It changes no doc page the repository's AGENTS.md maps to.

Two things to keep in mind, neither blocking:

  • Untested paths: you said the live service and the tap on a suggestion weren't exercised. Try both on a device before release.
  • Avatar loading: Avatar(url: actor.avatar …) fetches images from URLs the third-party service returns. That also reaches hosts beyond the typeahead service, so consider it with the App Store privacy answers you already flagged.
Merged as 4b1694c