Using GitSearch

How to find developers on GitHub, what this tool can and cannot see, and how to get more out of a search that has hit a wall.

1. What this tool does, and what it cannot do

GitSearch searches the public profiles of people who have a GitHub account. You type what you are looking for — a language, a city, a word from someone's bio — and it finds developers whose public profile matches, then keeps a copy so the same search is instant next time.

Four limits are worth knowing before you start.

GitHub returns at most 1,000 results for any one search

This is GitHub's rule, not ours, and there is no way around it directly. A search for Python developers in Germany might genuinely match forty thousand people; you will be able to page through one thousand of them. Section 8 explains how to slice a broad search into several narrower ones that between them reach the rest.

Only public information

Everything here is what each person chose to publish on their own profile. Nothing is inferred, scraped from web pages, bought from a third party, or combined with data from anywhere else. If a profile's location is blank, we do not know where they are.

Most people have not published an email address

An email only appears if the person deliberately put one on their GitHub profile. Expect the majority of results to have none. There is a second, narrower way to find one — see section 6 — but it does not work for everyone either, and it comes with conditions.

The data is a snapshot, not a live view

Results are stored so that repeating a search costs nothing. Every result row and profile page tells you how old its data is, and anything past the cache lifetime is marked stale. You can refresh any profile from its own page.

4. The rules, and the four that catch people out

GitHub's search syntax has some sharp edges. The strict form enforces all of these before it will run, so you get a sentence rather than a rejection, but they are worth understanding.

1. Repeating a filter means “or”. Different filters mean “and”.

location:Berlin location:Munich finds people in either city. location:Berlin language:Go finds people in Berlin who also write Go. This is the only way to express “or”, and it costs nothing against the operator limit below.

2. There are no parentheses

You cannot write (location:Berlin OR location:Munich) AND language:Go. GitHub rejects it. Repeat the qualifier instead, as above.

3. At most five explicit AND / OR / NOT

Written-out operators are limited to five per query. Since repeating a qualifier is a free “or” and a leading minus is a free “not”, you will rarely need any.

4. 256 characters, total

A longer query is rejected outright. The strict form shows a character counter; loose search shortens its own queries if they would overrun and tells you it did.

And one that is not a rule

Keywords search only the login, name, email and bio. They do not search repository names, repository descriptions, README files or code. Searching for kubernetes finds people who wrote the word in their bio, not people who have worked on it.

5. Reading the results

Each row is one person. The bar above them tells you:

  • How many. “1–20 of 1,000” means you can reach a thousand. If the true total is higher you will see a note saying so.
  • Where it came from. local cache means the answer came from profiles already stored and GitHub was not contacted at all. GitHub means this page was fetched live.
  • How old. “oldest record 12 days old” is the age of the least fresh profile on the page. A person's location or job may have changed since.

On each row:

  • The name opens their GitHub profile in a new tab. The @login opens our stored copy, with their repositories and language breakdown.
  • available for hire means they ticked that box on GitHub themselves. It is a strong signal and worth filtering on.
  • matched 3 readings means several of the queries we ran found this person — usually a sign of a good match.
  • stale means the stored data is older than the cache lifetime. Open the profile and press Refresh for current data.
  • Emails carry a badge saying where they came from: profile for an address the person published, and commit for one found in commit metadata. The difference matters — see the next section.

Browse local

The Browse local tab filters everything already stored, without ever contacting GitHub. Filter by location, language, company, follower range, whether they have an email, and how fresh the record is. It is the fastest way to work through profiles you have already collected, and it uses none of the daily allowance.

6. Emails, and the second way to find one

Most GitHub users do not publish an email address. When one is present on the profile it appears with a profile badge and you can use it.

When there is none, the email slot offers Fetch from repos. Git records an author address inside every commit, and GitHub publishes that for public repositories. Pressing the button asks GitHub for up to thirty recent commits it has already attributed to that person, across a handful of their repositories, and looks for an address.

What it will and will not return:

  • Addresses GitHub generates to protect people (@users.noreply.github.com) are discarded.
  • Bot and automation addresses, and role addresses like admin@, are discarded.
  • An address we cannot confidently attribute to that person is discarded, so a colleague's address in their repository is not recorded against their name.
  • If nothing is found, the button becomes “checked on <date>, retry” so nobody spends the allowance twice on the same silence.

Use these addresses thoughtfully. An address in commit metadata was published to attribute code, not to be contacted. That is why it is labelled differently, why the lookup never happens automatically, and why your administrator can switch the feature off for your whole account. Whether it is appropriate to contact someone on it is a judgement your organisation has to make — see our privacy policy.

Looking several up at once

Select some rows and press Fetch missing emails. It works through them one at a time and shows progress. It only touches profiles that have no address yet.

7. Exports

Tick the rows you want, or leave nothing ticked to export everything the search matched, then choose a format.

  • CSV — every column, opens in Excel or Google Sheets. Accented names come through correctly.
  • XLSX — the same columns as a real spreadsheet, with a frozen bold header row, sensible column widths and filters switched on.
  • LinkedIn — an import file for LinkedIn Recruiter. Exactly three columns (username, name, email), one row per address, and only people who have an email. Anyone without one is left out, because the file would be useless with a blank there. GitSearch offers to look for missing addresses first.

Exporting everything

Choosing “All results” does more work than exporting a page: it walks the whole result set, loads full details for anyone not already stored, and only then builds the file. For a thousand people that takes a few minutes, and you will see it counting up. Do not close the tab.

An export can never contain more than a thousand people, for the reason in section 1.

8. Getting past 1,000 results

GitHub caps every search at a thousand results. The way around it is to turn one broad search into several narrower ones that do not overlap, and run them in turn.

The two best fields to slice on are join date and follower count, because every person has exactly one value for each, so the slices cannot double-count.

Slicing by join date

Suppose location:Germany language:Python reports far more than a thousand. Run it several times in strict mode with an Account created range:

  • *..2013-12-31
  • 2014-01-01..2017-12-31
  • 2018-01-01..2020-12-31
  • 2021-01-01..2023-12-31
  • 2024-01-01..*

Each returns up to a thousand, and together they cover everyone. If a slice still reports a thousand, split that one further.

Slicing by followers

The same idea with Followers: 0..4, 5..19, 20..99, 100..499, >=500. This one has a useful side effect — the high-follower slices are small and tend to contain the most visible people, so start there if you want the best candidates first rather than all of them.

Slicing by place

Instead of one country, run each of its cities. Less exact, because some people write only the country and some only the city, so slices overlap and a few people appear twice — but it is often the most natural way to divide a search up.

Everything you collect goes into the same shared store, so after running several slices you can use Browse local to work through the combined set as one list, and export it in one file.

9. Questions people ask

I searched for a developer I know is on GitHub and did not find them.
Usually one of three things. Their profile may not say where they are — location is optional and many people leave it blank, so a city search will not find them. Their public repositories may not be in the language you searched for, even if that is what they work in. Or they may be past the thousandth result: try narrowing the search rather than paging. Searching for their username in Login on the strict tab will always find them if the account exists.
Why do so few people have an email?
Because publishing one on GitHub is optional and most people do not. That is a deliberate choice on their part, and it is worth treating as one. Section 6 covers the narrower second route.
The follower count looks wrong.
It is as of the last refresh — the date is on the row and the profile page. Open the profile and press Refresh for current numbers.
What does “from local cache” mean? Am I seeing old results?
It means the answer came from profiles already stored, so GitHub was not contacted. The data is as fresh as the date shown next to the badge. It is not a worse result — it is the same data, instantly and without using the daily allowance.
Search said there is no GitHub budget left.
GitHub allows a limited number of searches per minute and requests per hour, shared across everyone using GitSearch. It refills on its own; the message says when. Meanwhile, Local only and Browse local still work on everything already collected.
Can I search for people by their employer?
Only by what they typed in their own company field, which many leave blank or fill in loosely (“@acme”, “Acme Inc.”, “freelance”). Put the company name in Keywords as well — it searches the bio, where people often mention where they work.
Does GitSearch search repository code or READMEs?
No. Keywords cover the login, name, email and bio only. The Languages filter is the way to search on what someone actually builds.
Someone asked to be removed from your database.
Send them to our privacy policy, which explains how to ask, or forward the request to your administrator. We delete everything held about that person and make sure no future search collects them again. We cannot recall copies already exported, so please remove them from your own records too.
Two profiles look like the same person.
Some developers keep separate personal and work accounts. They are separate GitHub accounts and appear separately here; we do not guess that two accounts belong to one person.

GitSearch uses only strictly necessary cookies — to keep you signed in, to protect forms against cross-site request forgery, and to remember that you have read this notice. No analytics, no tracking, no third parties. Cookie policy.