Skip to content

Open a profile's followers and following from its counts - #10

Merged
simonhamp merged 3 commits into
mainfrom
feat/follow-lists
Oct 18, 2026
Merged

simonhamp merged 3 commits into
mainfrom
feat/follow-lists

Conversation

@simonhamp

@simonhamp simonhamp commented Oct 17, 2026 •

Copy link
Copy Markdown
Member

Tapping "N followers" or "N following" on a profile now opens the list of those people, as on the web.

What changed

  • New Connections screen at {tab}/users/{username}/followers and /following, pushed in the tab you tapped from. Titled "@ada's followers" or "@ada's following".
  • Each row copies the web's connections page: avatar ringed in their lane, name, handle, up to two lines of bio, and Follow or Following. It adds the app's "Follows you" badge where it applies. Your own row has no button. Tapping a row opens their profile.
  • Follow and Following flip straight away and go back if devnull refuses, like the profile's button. Follow wears your lane colour, as the other main buttons do since Wear your lane colour on the main buttons, and make full-width buttons large #8, and is in the lane buttons test.
  • On your own Following, unfollowing keeps the row as Follow until the list refreshes, as the web does, so a mistaken tap is one tap to undo. The web has no way to remove one of your followers, so neither does the app.
  • On your own Followers the "Follows you" badge is left off, because every row would have it.
  • Follow and Following sit in a 96pt slot so the button doesn't change width when it flips. A width class on the button itself does nothing, since EDGE sizes buttons to their label.
  • Load more on scroll, pull to refresh, and the web's empty states ("fatal: no followers yet", "Nobody is following @ada yet."). Across a block it shows the same message as the profile.
  • Lists are kept in the ResponseCache like the other screens: the first page shows at once, then refreshes behind it. A refreshed first page with no more after it replaces the list, so people who left go.

Cache changes reviewers should look at

  • ResponseCache::followChanged used to count a follow on your own profile only when the other person's profile was kept. Following someone from a list whose profile you never opened left your Following count wrong until the next refresh. Now a missing profile counts as a change.
  • A follow also sets is_followed on that person in every kept follower list, following list and notification group, so going back to any of them shows the new state at once.
  • Connections has a listPath() helper, not path(). A path() method on the class overrides OpensInTab's private static path() and quietly breaks openInTab.

API

Needs the followers and following endpoints from simonhamp/devnull.com#2, which is stacked on nunomaduro/dev-null.sh#130.

Verification

php artisan test on the rebased branch: 728 passed. The 2 deprecations come from Activity.php and were there before this branch.

On an iPhone 17 Pro simulator (iOS 27), signed in as local_dev against a local copy of the API branch, with a test user fl_ada who has 36 followers (since removed):

Your profile Your following Their followers
Profile with counts Your following fl_ada followers
Their following Empty Dark
fl_ada following Empty followers fl_ada followers in dark mode

After rebasing onto main (#9, #3, #7, #8, #4, #5) I checked it again on a fresh simulator, this time with taps: signed in through Sign in with GitHub, opened my Following from the count, unfollowed fl_ada (the row stays, Follow comes back in my lane colour at the same width), went back and the count had dropped from 2 to 1. Then I opened my Followers, a row (dking's profile), their followers, followed fl_ada again, opened fl_ada and their 36 followers, scrolled to the end (load more fetched the second page), followed Follower 1 there, and went back to find 3 following on my profile. Pull to refresh on my Following kept the list right.

Unfollowed Count after Their followers After load more Count after follows
Unfollowed, Follow in lane colour 1 following fl_ada followers End of list after load more 3 following

Recordings: unfollow and the count, browsing, following and load more.

🤖 Generated with Claude Code

simonhamp and others added 3 commits October 18, 2026 19:57
Tapping "N followers" or "N following" on a profile pushes a list of
those people, as the web's connections page lists them: newest follow
first, each with their avatar ringed in their lane, name, handle, two
lines of bio, Follows you where it applies, and Follow or Following.
A row opens their profile.

Follow flips straight away and goes back if devnull refuses. On your own
Following an unfollowed row stays as Follow, like the web, until the
list refreshes. The web can't remove a follower, so the app can't either.

Lists load more as you scroll, refresh when pulled, and open on the first
page kept last time. A follow anywhere now marks that person in every
kept list of people and counts on your profile even when theirs was
never opened.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A button sizes itself to its label, so a width class on it did nothing
and Following came out wider than Follow. The button now fills a slot of
its own. Bios also lose the extra line spacing, which looked loose at
14pt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main buttons now wear your lane, and the profile's Follow already does.
The Follow button on each row of a followers or following list does too,
and it's in the lane buttons test with the others. Following stays
secondary.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@simonhamp
simonhamp merged commit 869c81d into main Oct 18, 2026
1 check passed
@simonhamp
simonhamp deleted the feat/follow-lists branch October 19, 2026 09:24
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