{
  "markdown": "<div align=\"center\">\n\n# 🌐 DevGlobe\n\n**The open-source talent graph for humans and AI agents.**\n\n[![Live Demo](https://img.shields.io/badge/Live-Demo-blue?style=for-the-badge&logo=microsoftazure)](https://devglobe.dev)\n[![Documentation](https://img.shields.io/badge/Documentation-GitHub%20Pages-2ea44f?style=for-the-badge&logo=github)](https://sajeetharan.github.io/devglobe/)\n[![VS Code](https://img.shields.io/badge/VS%20Code-Install-007ACC?style=for-the-badge&logo=visualstudiocode)](https://marketplace.visualstudio.com/items?itemName=devglobedev.devglobe-developer-discovery)\n[![GitHub Stars](https://img.shields.io/github/stars/sajeetharan/devglobe?style=for-the-badge&logo=github)](https://github.com/sajeetharan/devglobe/stargazers)\n[![GitHub Sponsors](https://img.shields.io/github/sponsors/sajeetharan?style=for-the-badge&logo=githubsponsors&label=Sponsor)](https://github.com/sponsors/sajeetharan)\n[![License](https://img.shields.io/github/license/sajeetharan/devglobe?style=for-the-badge)](LICENSE)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen?style=for-the-badge)](CONTRIBUTING.md)\n\n<img src=\"assets/img/devglobe.gif\" alt=\"DevGlobe Demo\" width=\"800\" />\n\n*26,000+ developers · ranked by stars, commits, repo reach & StackOverflow reputation · searchable by skill, location & language*\n\n</div>\n\nDevGlobe is the open-source talent graph for humans and AI agents. It combines a 3D developer map with Azure Cosmos DB vector and hybrid search to surface relevant expertise from real contribution signals rather than popularity alone. The long-term vision is a consent-aware discovery layer where AI agents can find the right human collaborators.\n\nThe dynamic application is hosted on [Azure Container Apps](https://www.devglobe.dev). Product, API, MCP, Agent Skill, and agent-readiness documentation is published separately on [GitHub Pages](https://sajeetharan.github.io/devglobe/).\n\n> [!IMPORTANT]\n> **Connect an AI agent to DevGlobe:** MCP-compatible agents can use the hosted endpoint at `https://www.devglobe.dev/mcp` to search public developer profiles without credentials. Verified agents can also request developer-approved introductions. See the [MCP setup guide](docs/mcp-server.md).\n>\n> **Use DevGlobe in VS Code:** Install [DevGlobe.dev Developer Discovery](https://marketplace.visualstudio.com/items?itemName=devglobedev.devglobe-developer-discovery) to search profiles, share identity cards, and copy MCP configuration from the Command Palette.\n\n## 🎬 Watch the DevGlobe Demo\n\n<div align=\"center\">\n   <a href=\"https://www.youtube.com/watch?v=eXJWHis-skA\">\n      <img src=\"https://i.ytimg.com/vi/eXJWHis-skA/maxresdefault.jpg\" alt=\"Watch the DevGlobe developer discovery platform demo on YouTube\" width=\"800\" />\n   </a>\n   <br />\n   <strong><a href=\"https://www.youtube.com/watch?v=eXJWHis-skA\">DevGlobe: The Open-Source Talent Graph for Humans and AI Agents</a></strong>\n</div>\n\n---\n\n## ✨ Features\n\n- **Interactive 3D Globe** — Explore developers pinned to their real-world locations using Three.js\n- **AI-Powered Search** — Hybrid + vector search via Azure Cosmos DB (e.g. \"AI & deep learning\", \"full stack JS dev\")\n- **Composite Scoring** — Each developer scored 0–100 across 6 dimensions\n- **Leaderboard** — Filter by country, language, or sort by score/stars/commits\n- **Developer Profiles** — Click any pin to see detailed stats, top repos, and contribution breakdown\n- **Remote MCP Access** — Agents can discover developers and request consent-gated introductions through hosted tools\n- **VS Code Extension** — Search developers, open profiles, share identity cards, and configure MCP from the editor\n- **Mobile Responsive** — Bottom-sheet filters and full-width search on smaller screens\n\n## 🚀 Quick Start\n\n### Option 1: Zero-config (sample data, no database needed)\n\n```bash\ngit clone https://github.com/sajeetharan/devglobe.git\ncd devglobe\nnpm install\nnpm run dev\n# Open http://localhost:3000\n```\n\nThe app automatically falls back to the bundled sample data (20 developers) when no Cosmos DB credentials are configured. **No API keys, no emulator, no setup** — just clone and run.\n\n> Text search works fully offline. Vector/hybrid search requires Azure OpenAI (see Option 3).\n\n---\n\n### Option 2: Cosmos DB Emulator (full database experience locally)\n\nFor contributors working on the API layer or data pipeline:\n\n1. **Install the Cosmos DB Emulator** — [Download here](https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-develop-emulator) (Windows, macOS via Docker, or Linux Docker)\n\n2. **Start the emulator** and wait for it to be ready at `https://localhost:8081`\n\n3. **Seed sample data into the emulator:**\n   ```bash\n   npm run seed-emulator\n   ```\n\n4. **Create `.env.local`** (the seed script prints this for you):\n   ```env\n   COSMOS_ENDPOINT=https://localhost:8081\n   COSMOS_KEY=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==\n   ```\n\n5. **Run the app:**\n   ```bash\n   npm run dev\n   ```\n\n> The emulator key above is Microsoft's [well-known emulator key](https://learn.microsoft.com/en-us/azure/cosmos-db/emulator#authentication) — it is intentionally public and only works locally.\n\n---\n\n### Option 3: Full Azure backend (vector + hybrid search)\n\nFor the complete experience including AI-powered search:\n\n```env\n# .env.local\nCOSMOS_ENDPOINT=https://your-account.documents.azure.com:443/\nCOSMOS_KEY=your-cosmos-key\nAZURE_OPENAI_ENDPOINT=https://your-openai.openai.azure.com/\nAZURE_OPENAI_KEY=your-openai-key\nEMBEDDING_DEPLOYMENT=text-embedding-3-small\nAZURE_OPENAI_CHAT_DEPLOYMENT=gpt-4o-mini\n```\n\n`AZURE_OPENAI_CHAT_DEPLOYMENT` enables generated fun facts on identity cards. Cards use factual profile copy when the chat deployment is unavailable.\n\nProduction serves the Next.js application from Azure Container Apps, high-volume public API reads from Azure Functions, and the developer snapshot from Azure Blob Storage. See [docs/azure-backend.md](docs/azure-backend.md) for the resource layout, environment switches, and deployment checks.\n\n```bash\nnpm run dev\n```\n\n## 🏗️ Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Frontend | React 19, Three.js (react-globe.gl), Next.js 15 |\n| Search | Azure Cosmos DB (vector + hybrid search) |\n| API | Next.js API Routes |\n| Hosting | Azure Container Apps and Azure Functions |\n| Data Pipeline | Node.js scripts (GitHub GraphQL, StackOverflow API, geocoding) |\n\n## 📊 Scoring Formula (0–100)\n\n| Dimension | Weight | Source |\n|-----------|--------|--------|\n| GitHub Stars | 20% | Total stars across repos |\n| GitHub Commits | 20% | Yearly commit activity |\n| Repo Reach | 15% | Forks + watchers |\n| SO Reputation | 25% | StackOverflow reputation |\n| SO Engagement | 15% | Answer acceptance × count |\n| Community | 5% | Followers + badges |\n\nAll dimensions are log-normalized to prevent outlier domination.\n\n## 🔧 Building the Full Dataset\n\nRequires API keys — copy `.env.example` to `.env` and fill in your tokens.\n\n```bash\nnpm run fetch-github          # Fetch top devs from GitHub GraphQL\nnpm run fetch-stackoverflow   # Enrich with StackOverflow reputation\nnpm run geocode               # Convert locations to lat/lng\nnpm run build-data            # Run full pipeline\nnpm run upload-cosmos         # Upload to Azure Cosmos DB\n```\n\n### Developer credentials\n\nVerified community credentials are stored explicitly on each developer document. Do not infer them from stars, followers, or profile text.\n\n```json\n{\n   \"login\": \"example\",\n   \"specialTags\": [\"github-star\", \"microsoft-mvp\", \"aws-community-builder\"]\n}\n```\n\nSupported IDs: `github-star`, `microsoft-mvp`, `google-developer-expert`, `docker-captain`, `cncf-ambassador`, `aws-hero`, and `aws-community-builder`. The legacy `docker-champion` ID remains supported. The upload script preserves this field from source JSON, and the list, detail, and search APIs project it from Cosmos DB.\n\nPopulate exact GitHub-login matches from the official GitHub Stars, Google Developer Experts, and CNCF Ambassadors rosters:\n\n```bash\nnpm run populate-special-tags             # Dry run\nnpm run populate-special-tags -- --apply  # Patch verified matches in Cosmos DB\n```\n\nThe command preserves existing tags and is idempotent. Other credentials require an official profile that explicitly identifies the developer's GitHub account; do not populate them by matching display names.\n\n## 📁 Project Structure\n\n```\n├── index.html                  # Entry HTML\n├── src/\n│   ├── main.jsx                # Application bootstrap\n│   ├── App.jsx                 # Root component, data loading\n│   ├── components/\n│   │   ├── Globe.jsx           # 3D globe (react-globe.gl)\n│   │   ├── Leaderboard.jsx     # Ranked sidebar with filters\n│   │   ├── SearchBar.jsx       # Hybrid/vector search input\n│   │   ├── DetailPanel.jsx     # Developer detail card\n│   │   ├── Header.jsx          # Top bar with branding\n│   │   └── LoadingOverlay.jsx  # Loading state\n│   └── utils/\n│       ├── scoring.js          # Composite scoring algorithm\n│       └── format.js           # Number formatting helpers\n├── api/\n│   ├── developers.js           # List all developers\n│   ├── developer.js            # Single developer lookup\n│   └── search.js               # Cosmos DB vector/hybrid search\n├── scripts/                    # Data pipeline scripts\n├── styles/main.css             # Dark theme styles\n└── data/\n    └── developers-sample.json  # Sample data for local dev\n```\n\n## 🌍 Deploy to Azure Container Apps\n\nPushes to `main` build the standalone Next.js image in Azure Container Registry and deploy it to Azure Container Apps through GitHub Actions OIDC. The deployment identity requires Contributor access scoped to the application resource group and these repository variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, and `AZURE_SUBSCRIPTION_ID`.\n\nRequired environment variables:\n\n| Variable | Purpose |\n|----------|---------|\n| `COSMOS_ENDPOINT` | Azure Cosmos DB endpoint |\n| `COSMOS_KEY` | Azure Cosmos DB key |\n| `COSMOS_DATABASE` | Database name |\n| `COSMOS_CONTAINER` | Container name |\n| `COSMOS_ACTIVITY_CONTAINER` | Rolling GitHub activity container (`activities`) |\n| `COSMOS_CONTACTS_CONTAINER` | Private lifecycle-email contact container (`developer-contacts`) |\n| `COSMOS_ENGAGEMENT_CONTAINER` | Privacy-filtered engagement events (default: `engagement-events`) |\n| `COSMOS_CONTRIBUTION_STATE_CONTAINER` | Shared GitHub recommendation quota state (default: `contribution-opportunity-state`) |\n| `ENGAGEMENT_HASH_SECRET` | HMAC secret for session-window deduplication; defaults to `SESSION_SECRET` |\n| `ACTIVITY_INGEST_SECRET` | Bearer secret for the activity collector endpoint |\n| `RESEND_API_KEY` | Optional Resend API key for claim and approval emails |\n| `EMAIL_FROM` | Sender on a domain verified by Resend |\n| `COSMOS_WATCHLIST_CONTAINER` | Optional private watchlist container name (default: `watchlists`) |\n| `COSMOS_IMPACT_HISTORY_CONTAINER` | Optional impact snapshot container name (default: `impact-history`) |\n| `CRON_SECRET` | Bearer token shared by protected cron endpoints and Azure Timer Functions |\n| `EMAIL_PREFERENCE_SECRET` | HMAC secret for weekly-email unsubscribe links; defaults to `SESSION_SECRET` |\n\nLifecycle emails are transactional and best-effort. Claims use the verified primary email authorized through GitHub OAuth; self-nominations collect an explicitly consented notification address. Addresses are stored only in the private `developer-contacts` container and are never projected by public APIs or copied into developer documents. Create the container before deployment:\n\n```bash\nnpm run setup-contacts-container\n```\n\nSee the [lifecycle email PRD](docs/prd/lifecycle-email-notifications.md).\n\nClaimed-profile visibility insights use allow-listed engagement events with hashed session IDs. Create the TTL-enabled container before deployment with `node scripts/setup-engagement-container.js`. See the [engagement analytics contract](docs/prd/engagement-analytics.md) for event semantics, privacy thresholds, and deletion behavior.\n\nClaimed developers can also configure personalized open-source contribution recommendations. Candidates come only from public, fresh, unassigned GitHub issues in repositories with contribution guidance. Create the shared quota-state container with `node scripts/setup-contribution-state-container.js` before deployment. See the [contribution opportunities contract](docs/prd/contribution-opportunities.md).\n\nVerified users can explicitly opt in to a Monday weekly digest from the user menu. The first run records a private comparison baseline without sending email; later messages require rank movement, a fresh contribution opportunity, or a pending introduction request and include an attributed deep link to the relevant action. The Azure Functions app invokes `/api/cron/weekly-digest` at 13:00 UTC each Monday; only verified contacts with `productUpdatesEnabled: true` are eligible. Each message uses a per-user, per-week idempotency key and includes one-click unsubscribe headers and a signed unsubscribe link.\n\nGenerate a manual-review activation queue and weekly social spotlight from public, unclaimed profiles:\n\n```bash\nnpm run activation-campaign -- --limit=100 --output=data/activation-campaign.json\n```\n\nThe command is read-only against Cosmos DB and never sends messages or retrieves private contact details. Review each draft before contacting a developer through an appropriate public channel.\n\n### Live developer activity\n\nThe Activity tab is anonymous and shows a rolling 24-hour feed for indexed developers. Create its dedicated Cosmos container before deployment:\n\n```bash\nnpm run setup-activity-container\n```\n\nDeploy `functions/activity-ingest` as an Azure Timer Function and configure these application settings:\n\n```env\nACTIVITY_INGEST_URL=https://your-site.example/api/activities/ingest\nACTIVITY_INGEST_SECRET=the-same-secret-configured-on-the-site\n```\n\nThe timer invokes the collector every minute, matching GitHub's advertised polling interval. GitHub's public Events API is best-effort and may delay or omit events; the 15-second browser refresh does not guarantee GitHub source delivery within that interval. A valid `GITHUB_TOKEN` is required for full three-page collection; anonymous fallback inspects one page only. The Cosmos activity container uses a 48-hour TTL while the API exposes only the latest 24 hours.\n\n### Impact history capture\n\nDeploy the `functions` directory to an Azure Function App and configure these application settings for the 15-minute impact-history timer:\n\n```env\nIMPACT_HISTORY_URL=https://www.devglobe.dev/api/cron/impact-history\nCRON_SECRET=the-same-secret-configured-on-the-container-app\n```\n\nThe timer resumes the current UTC day's capture in RU-bounded batches. Keep `IMPACT_HISTORY_CONCURRENCY` and `IMPACT_HISTORY_BATCH_SIZE` on the Container App because the Next.js endpoint performs the Cosmos work.\n\n### Email verification reminders\n\nThe Azure Functions app invokes the protected reminder endpoint daily at 14:00 UTC. The application sends reminders only to unverified contacts who consented to transactional email and have not received a reminder in the previous 72 hours; verified contacts stop receiving reminders immediately.\n\nConfigure these application settings on the Azure Function App:\n\n```env\nEMAIL_VERIFICATION_REMINDERS_URL=https://www.devglobe.dev/api/cron/email-verification-reminders\nWEEKLY_DIGEST_URL=https://www.devglobe.dev/api/cron/weekly-digest\nCRON_SECRET=the-same-secret-configured-on-the-container-app\n```\n\nDeploy the complete `functions` directory so each timer and its `function.json` are included.\n\n## Support DevGlobe\n\nDevGlobe is independently maintained and free to use. [GitHub sponsorship](https://github.com/sponsors/sajeetharan) helps fund Azure hosting and observability, public-data refreshes, GitHub API-backed processing, security updates, testing, and open-source maintenance.\n\nSponsorship never influences developer rankings, search placement, moderation, or access to private developer information. See the [funding and transparency policy](docs-site/guide/funding.md) for tiers, benefits, costs, and current milestones.\n\n## 🤝 Contributing\n\nContributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions and areas where help is needed.\n\n## 🤖 MCP Server\n\nDevGlobe exposes a hosted Streamable HTTP MCP endpoint for public developer discovery and consent-gated agent introductions:\n\n```text\nhttps://www.devglobe.dev/mcp\n```\n\nPublic search and profile lookup work anonymously. Introduction requests and status polling require an issued agent credential. A local stdio connector remains available for clients that do not support remote MCP:\n\n```bash\nnpm run mcp\n```\n\nSee [docs/mcp-server.md](docs/mcp-server.md) for credential provisioning, Cosmos DB setup, client configuration, and the consent lifecycle. [docs/agent-readiness.md](docs/agent-readiness.md) documents machine-readable discovery, WebMCP, and the external DNS-AID deployment steps.\n\n## 📄 License\n\nMIT — see [LICENSE](LICENSE) for details.\n\n---\n\n<div align=\"center\">\n\n**[⭐ Star this repo](https://github.com/sajeetharan/devglobe)** if you find it useful!\n\nBuilt with ❤️ by [@sajeetharan](https://github.com/sajeetharan)\n\n</div>\n",
  "bytes": 17289,
  "sha": "6be56c41cb90ceb2e324ce5833545e849da69fedd5ae77f527f93cbe9f941b73",
  "repo_slug": "sajeetharan/devglobe",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_sajeetharan_devglobe_f24e6f53/readme"
}