---
title: "GitHub Member Sync, AI-Enriched Profiles & Smart Project Filtering"
description: "xeve now imports your entire GitHub org — members, contributors, and activity. AI infers roles from commit patterns, generates project descriptions from READMEs, and the People page shows everyone in your org, not just xeve users."
date: "2026-03-20"
app: orma
category: "building-xeve"
readingTime: "6 min read"
---

<p>Until now, xeve's org features had a blind spot: the People page only showed users who had signed up for xeve, and the Projects page dumped every repo onto a single unsorted list. If your GitHub org has 50+ repos and 30 members, only the 5 who installed xeve were visible. That changes today.</p>

<h2>Full GitHub Org Member Sync</h2>

<p>When you trigger a GitHub sync, xeve now fetches every member of your GitHub organization — not just contributors to repos. For each member, we pull their full profile: name, bio, company, email, location, and avatar. All of this lands in a new <code>org_github_members</code> table with automatic deduplication.</p>

<p>The sync runs in parallel batches of 10 user detail requests to stay under GitHub's rate limits while still being fast. A 30-member org completes in about 3 seconds.</p>

<p>When a GitHub member later signs up for xeve and joins your org, a database trigger automatically links their GitHub identity to their xeve account. No manual mapping needed.</p>

<h2>AI-Inferred Roles and Titles</h2>

<p>Most GitHub profiles don't have job titles. But their commit patterns, the repos they contribute to, and their bio text contain strong signals. The new <code>ai-infer-roles</code> edge function collects these signals and sends them to Claude Sonnet in batches of 10 members.</p>

<p>The AI returns a structured role (engineering, design, product, data, devops, management) and a specific title like "Senior Backend Engineer" or "Product Manager." These inferred titles appear on the People page with a subtle "AI" badge, so it's always clear what's human-entered vs. machine-inferred.</p>

<p>Inference runs at most every 30 days per member and costs about $0.05 per batch of 20 members. The signals used for inference are stored alongside the result so you can understand why the AI made a particular call.</p>

<h2>AI-Generated Project Descriptions</h2>

<p>When GitHub repos are synced as projects, many come through with no description — especially internal tools and services. The new <code>ai-enrich-projects</code> function fixes this by fetching each project's README (first 2000 chars), last 10 commit messages, and last 5 merged PR titles, then asking Claude Sonnet to write a concise 1-2 sentence description.</p>

<p>It only runs on projects where <code>description IS NULL</code>, and processes at most 10 per invocation to keep costs around $0.03 per run. Once a description is set — whether by AI or manually — it won't be overwritten.</p>

<h2>Smart Project Filtering</h2>

<p>The Projects page now has three filter tabs: <strong>Active</strong> (default), <strong>All</strong>, and <strong>Archived</strong>. Active means the repo was pushed to within the last 30 days. The sync function automatically updates project status based on <code>pushed_at</code> — but it never overrides projects you've manually marked as completed or archived.</p>

<p>Each project card now shows stacked contributor avatars (up to 5, with an overflow count) and total commit count. The list is sorted by <code>last_pushed_at</code> so your most active projects appear first. This turns what was a flat, unsorted dump of 50 repos into a useful at-a-glance view of what's actually being worked on.</p>

<h2>The New People Page</h2>

<p>The People page now has three sections instead of one:</p>

<ol>
<li><strong>Team Members</strong> — everyone with an xeve account in your org. If they have no manual title but their GitHub identity has an AI-inferred title, it shows in italic with an "AI" badge. Search and role filtering still work.</li>
<li><strong>GitHub Members</strong> — people in your GitHub org who haven't joined xeve yet. Shows their avatar, name, inferred role/title, and email. Each row has an "Invite" button. If the member has no public email, you can type one in inline before sending.</li>
<li><strong>Pending Invites</strong> — all outstanding invitations with expiry countdown, who sent them, and actions to resend (for expired) or revoke.</li>
</ol>

<p>The GitHub Members section only appears when a GitHub integration is active and there are unlinked members — if everyone's already on xeve, it stays hidden.</p>

<h2>Project Detail: GitHub Contributors</h2>

<p>Each project detail page now has a "GitHub Contributors" section showing every contributor from the repo's contributor list. Each entry shows their avatar, GitHub login (linked to their profile), and commit count. This is sourced from the <code>contributors</code> JSONB column that the sync now stores on every project.</p>

<h2>What's Next</h2>

<p>The foundation is now in place for richer team analytics: per-member contribution trends, cross-project activity heatmaps, and eventually AI-generated team insights that consider both xeve tracking data and GitHub activity together. The member sync also unlocks better meeting attendee resolution — matching GitHub usernames to meeting participants for automatic task assignment.</p>
