Compare repositories

Compare two repositories to analyze their collaboration patterns, metrics, and development workflows. See how your favorite projects stack up.

Select first repository

`; } }) .join(''); if (results.length > 0) { searchResults.classList.remove('hidden'); } else { searchResults.classList.add('hidden'); } // Add click handlers to results const resultItems = searchResults.querySelectorAll('a, div'); resultItems.forEach(item => { item.addEventListener('click', (e) => { e.preventDefault(); const value = item.dataset.value; selectValue(value); }); }); } function selectValue(value) { searchInput.value = value; searchInput.dataset.selectedValue = value; selectedValue = value; searchResults.classList.add('hidden'); // Trigger custom event for the parent component to handle const event = new CustomEvent('reposelected', { detail: { value, inputId: 'repo1-search' } }); searchInput.dispatchEvent(event); // Execute callback if provided } function updateSelection() { const items = searchResults.querySelectorAll('a, div'); items.forEach((item, index) => { if (index === selectedIndex) { item.classList.add('bg-gray-100'); item.scrollIntoView({ block: 'nearest' }); } else { item.classList.remove('bg-gray-100'); } }); } function filterRepos(query) { return repos.filter(repo => { const repoName = typeof repo === 'string' ? repo : repo.name; return repoName.toLowerCase().includes(query.toLowerCase()); }); } searchInput.addEventListener('input', (e) => { const query = e.target.value.trim(); if (query.length > 0) { const results = filterRepos(query); showResults(results); selectedIndex = -1; } else { searchResults.classList.add('hidden'); } }); searchInput.addEventListener('focus', () => { if (searchInput.value.trim()) { const results = filterRepos(searchInput.value.trim()); showResults(results); } }); searchInput.addEventListener('keydown', (e) => { const items = searchResults.querySelectorAll('a, div'); const itemCount = items.length; if (itemCount === 0) return; switch (e.key) { case 'ArrowDown': e.preventDefault(); selectedIndex = (selectedIndex + 1) % itemCount; updateSelection(); break; case 'ArrowUp': e.preventDefault(); selectedIndex = selectedIndex <= 0 ? itemCount - 1 : selectedIndex - 1; updateSelection(); break; case 'Enter': if (selectedIndex >= 0 && !searchResults.classList.contains('hidden')) { e.preventDefault(); const selectedItem = items[selectedIndex]; selectValue(selectedItem.dataset.value); } break; case 'Escape': searchResults.classList.add('hidden'); searchInput.blur(); break; } }); // Close search results when clicking outside document.addEventListener('click', (e) => { if (!searchResults.contains(e.target) && e.target !== searchInput) { searchResults.classList.add('hidden'); } }); }) ();

Select second repository

`; } }) .join(''); if (results.length > 0) { searchResults.classList.remove('hidden'); } else { searchResults.classList.add('hidden'); } // Add click handlers to results const resultItems = searchResults.querySelectorAll('a, div'); resultItems.forEach(item => { item.addEventListener('click', (e) => { e.preventDefault(); const value = item.dataset.value; selectValue(value); }); }); } function selectValue(value) { searchInput.value = value; searchInput.dataset.selectedValue = value; selectedValue = value; searchResults.classList.add('hidden'); // Trigger custom event for the parent component to handle const event = new CustomEvent('reposelected', { detail: { value, inputId: 'repo2-search' } }); searchInput.dispatchEvent(event); // Execute callback if provided } function updateSelection() { const items = searchResults.querySelectorAll('a, div'); items.forEach((item, index) => { if (index === selectedIndex) { item.classList.add('bg-gray-100'); item.scrollIntoView({ block: 'nearest' }); } else { item.classList.remove('bg-gray-100'); } }); } function filterRepos(query) { return repos.filter(repo => { const repoName = typeof repo === 'string' ? repo : repo.name; return repoName.toLowerCase().includes(query.toLowerCase()); }); } searchInput.addEventListener('input', (e) => { const query = e.target.value.trim(); if (query.length > 0) { const results = filterRepos(query); showResults(results); selectedIndex = -1; } else { searchResults.classList.add('hidden'); } }); searchInput.addEventListener('focus', () => { if (searchInput.value.trim()) { const results = filterRepos(searchInput.value.trim()); showResults(results); } }); searchInput.addEventListener('keydown', (e) => { const items = searchResults.querySelectorAll('a, div'); const itemCount = items.length; if (itemCount === 0) return; switch (e.key) { case 'ArrowDown': e.preventDefault(); selectedIndex = (selectedIndex + 1) % itemCount; updateSelection(); break; case 'ArrowUp': e.preventDefault(); selectedIndex = selectedIndex <= 0 ? itemCount - 1 : selectedIndex - 1; updateSelection(); break; case 'Enter': if (selectedIndex >= 0 && !searchResults.classList.contains('hidden')) { e.preventDefault(); const selectedItem = items[selectedIndex]; selectValue(selectedItem.dataset.value); } break; case 'Escape': searchResults.classList.add('hidden'); searchInput.blur(); break; } }); // Close search results when clicking outside document.addEventListener('click', (e) => { if (!searchResults.contains(e.target) && e.target !== searchInput) { searchResults.classList.add('hidden'); } }); }) ();

Suggested comparisons:

Core Team PRs
Percentage of PRs created by the core team
45.0%
Community PRs
Percentage of PRs created by the community
52.0%
Bot PRs
Percentage of PRs created by bots
3.0%
Bot PRs
Percentage of PRs created by bots
3.0%
Human PRs
Percentage of PRs created by humans
97.0%
The bot PRs for this repo are all coming from dependabot.
Bot Activity
Percentage of repository events performed by bots
1.1%
Unique Bots
Number of unique bots active in this repository
4
Review-Merge Rate
Percentage of merged PRs that received reviews
89.0%
Review Rate
Percentage of PRs that received reviews
89.0%
Approval Rate
Percentage of reviewed PRs that were approved
100.0%
Turnaround Time
Median time to first review
5.0 hours
Reviewed in an Hour
PRs that received a review within 1 hour
24.1%
Overall Median Approval Time
Median time between review request and approval
17.2 hours
Overall Median Merge Time
Median time from PR creation to merge
22.3 hours