Skip to content

feat: unclaimed profiles for mentioned developers - #648

Closed
mnapoli wants to merge 8 commits into
productionfrom
feat/unclaimed-profiles
Closed

mnapoli wants to merge 8 commits into
productionfrom
feat/unclaimed-profiles

Conversation

@mnapoli

@mnapoli mnapoli commented Oct 19, 2026

Copy link
Copy Markdown
Member

A developer who isn't on /dev/null yet gets a profile at /@username once an approved commit mentions them. The goal is to make well-known GitHub developers want to join.

  • The profile: their GitHub name and avatar, how many members follow them on GitHub and are waiting to follow them here, and a Mentions tab. Guests see an "I am @username" button, which signs in with GitHub.
  • Signing in claims it: the old mentions become regular mentions, and the waiting followers follow the new user.
  • Mentions link to it: in commits, a mention of someone who isn't here links to their unclaimed profile.
  • What's stored: only the mentions, and the GitHub follows of members towards accounts that aren't here yet. No profiles, and nothing is crawled. A username nobody mentioned is still a 404, so GitHub is only asked about mentioned usernames, and the answer is cached for a day.
  • Not indexed: the page is public but excluded from search engines. Organizations get no profile.

After deploying, php artisan follows:pending backfills the pending follows of existing members. Without it, nobody shows as "waiting" until new members sign in.

Not included yet:

  • a way for someone to ask for their unclaimed profile to be hidden;
  • turning the old mentions into notifications when they sign in;
  • verifying that a mentioned username is a real GitHub account before linking it. Today @everyone links to a 404, with rel="nofollow".

Guest, desktop

Unclaimed profile, guest

Dark mode

Unclaimed profile, dark mode

Mobile

Unclaimed profile, mobile

Signed-in member (no "I am" button)

Unclaimed profile, signed in

Nobody waiting yet

Unclaimed profile without waiting followers

Mention link in the log

Mention of an unclaimed profile in the log

A developer who isn't on /dev/null yet gets a profile at /@username once an
approved commit mentions them: their GitHub name and avatar, how many members
follow them on GitHub and are waiting to follow them here, and the commits that
mention them. Signing in claims it, turns those mentions into regular ones and
brings the waiting followers over.
Copilot AI balanced review requested due to automatic review settings October 19, 2026 17:51
Scheduled commits keep their mentions as plain text, waiting followers
across a block from the viewer are left out, the sign-in job keeps the
username it was dispatched for, and a rate-limited follows:pending run
keeps its resume point.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Mention conversion can permanently lose captured identities through concurrent updates and numeric-key renumbering.

2 open issues
What changed in this PR

Adds public, unclaimed profiles for mentioned GitHub developers, connecting existing mentions and waiting followers when they join.

Changes:

  • Adds cached GitHub profile lookup, profile rendering, and mention links.
  • Stores pending mentions and follows, with sign-in conversion and backfills.
  • Adds tests and documents the new behavior.
File Description
tests/​Unit/​LinkifiedText.test.tsx Tests unclaimed mention links.
tests/​Unit/​Actions/​UpdateOrCreateUserTest.php Tests claiming mentions on sign-in.
tests/​Unit/​Actions/​UpdateCommitMentionsTest.php Tests mention conversion.
tests/​Unit/​Actions/​CreateUserGitHubFollowsTest.php Tests pending follow imports.
tests/​Unit/​Actions/​CreatePendingMentionsTest.php Tests pending mention capture.
tests/​Unit/​Actions/​CreatePendingFollowsTest.php Tests pending follow storage.
tests/​Feature/​PendingMentionsBackfillTest.php Tests historical mention backfill.
tests/​Feature/​Controllers/​UnclaimedProfileTest.php Tests profile visibility, lookup, and caching.
tests/​Feature/​Commands/​ImportPendingGitHubFollowsTest.php Tests follow backfill and failures.
resources/​js/​pages/​user/​unclaimed.tsx Adds the unclaimed profile page.
resources/​js/​components/​linkified-text.tsx Links uncaptured mentions to profiles.
resources/​js/​components/​commit-body.tsx Enables unclaimed links in posted commits.
PRODUCT.md Documents behavior and deployment command.
KNOWLEDGE_BASE.md Explains unclaimed profiles to users.
database/​migrations/​2026_10_19_170002_create_pending_follows_table.php Creates pending follow storage.
database/​migrations/​2026_10_19_170001_backfill_pending_mentions.php Backfills historical mentions.
database/​migrations/​2026_10_19_170000_create_pending_mentions_table.php Creates pending mention storage.
database/​factories/​PendingMentionFactory.php Supplies pending mention fixtures.
database/​factories/​PendingFollowFactory.php Supplies pending follow fixtures.
app/​Services/​PageMetadata.php Adds non-indexable profile metadata.
app/​Queries/​PendingMentionCommitsQuery.php Retrieves visible mentioning commits.
app/​Queries/​PendingFollowersQuery.php Counts and previews waiting followers.
app/​Queries/​GitHubAccountQuery.php Fetches and caches personal GitHub accounts.
app/​Models/​User.php Adds pending follow relationship.
app/​Models/​PendingMention.php Models unclaimed mentions.
app/​Models/​PendingFollow.php Models waiting follows.
app/​Models/​Commit.php Adds pending mention relationship.
app/​Jobs/​UpdateCommitMentionsJob.php Queues mention conversion.
app/​Http/​Requests/​ShowUserRequest.php Resolves registered or unclaimed profiles.
app/​Http/​Controllers/​UserController.php Serves unclaimed profiles and redirects owners.
app/​Dto/​GitHubAccount.php Maps GitHub account data.
app/​Console/​Commands/​ImportPendingGitHubFollowsCommand.php Adds resumable follow backfill.
app/​Actions/​UpdateOrCreateUser.php Dispatches mention conversion after sign-in.
app/​Actions/​UpdateCommitMentions.php Converts pending mentions into captured identities.
app/​Actions/​CreateUserGitHubFollows.php Imports waiting followers.
app/​Actions/​CreatePendingMentions.php Captures unregistered usernames.
app/​Actions/​CreatePendingFollows.php Stores follows toward unregistered accounts.
app/​Actions/​CreateCommit.php Captures pending mentions during creation.

Review effort: Balanced

Comment thread app/Actions/UpdateCommitMentions.php Resolved
Comment thread app/Actions/UpdateCommitMentions.php Resolved
Reuse MemberStack, shared commit scopes and the default preview image,
claim mentions from the sign-in controller only for new usernames, keep
only what the profile shows of GitHub accounts and wait a minute before
asking GitHub again after a failure.
Wait for the rate limit to reset when fewer than 2,000 requests are left, so sign-ins keep importing their follows, and read whom users follow by their username instead of looking up their login first.
The command now queues a job that reads a batch of users and queues the next one, waiting for the GitHub rate limit to reset whenever fewer than 2,000 requests are left, so it can run unattended from Laravel Cloud.
@mnapoli

mnapoli commented Nov 2, 2026

Copy link
Copy Markdown
Member Author

Replaced by #1406 and up

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.

2 participants