TraceFind Blog Back to searchingSearch Start Now
  1. TraceFind
  2. Blog
  3. Tutorials
Tutorials

GitHub OSINT: What a GitHub Profile Reveals

A candidate says they are a senior engineer with ten years of open source behind them, and gives you a GitHub link. Five minutes on that profile can confirm the story, undermine it, or hand you a work email nobody meant to publish. This guide covers what a GitHub account exposes, how to read it without over-reading it, and, for developers, how to stop giving it away.

In short
  • A GitHub account ties together a handle, a name, an employer, keys and years of timestamped activity, all public.
  • The numeric account ID never changes, so record it: it lets you recognise the account after a rename.
  • Adding .patch to a commit URL shows the author name and email the committer configured. It is a lead, not a verified identity.
  • Commit time zones can check a claim ("based in Berlin") but must never be used to locate a person.
  • Developers can fix most of this with a noreply address and two settings.

Why GitHub matters in an investigation

A GitHub account is rarely just a code store. A security team checking which developer accounts belong to the company, a trust and safety analyst testing a "senior engineer" persona, or a journalist confirming who maintains a project all get something useful from it: a real or semi-real name, an employer, a website and a long, dated activity trail.

It is also a place where accuracy matters. Git metadata is set by whoever makes the commit, so it can be wrong, stale or deliberately misleading. Treat everything below as leads to corroborate. Before you start, be sure you have a legitimate purpose and a lawful basis; the legal and ethical OSINT guide explains what that means under the GDPR.

Diagram: github.com/jdoe-dev branches into five sources. Profile gives name, company, location and website. Commits give author name and email and UTC offset. SSH and GPG keys can match another account. Gists hold snippets, configs and pasted secrets. Public organisations show employer, teams and projects.
Five public places a single handle opens up. The next sections take them in order of how much they tend to tell you.

What the public profile shows

The profile page and the public REST API expose the same core fields. For the fictional account jdoe-dev you request one address:

bash
# public profile as JSON
curl -s https://api.github.com/users/jdoe-dev

# public organisation memberships
curl -s https://api.github.com/users/jdoe-dev/orgs

The fields worth reading:

  • id: a numeric account ID that never changes, even when the user renames the account. Write it down so you can recognise the same account under a new handle.
  • created_at: when the account was opened. A profile claiming ten years of open source work but created last month deserves a second look.
  • name, company, location, blog: free text the user filled in. Self-reported, but people reuse the same wording elsewhere, which makes these good search pivots.
  • public_repos, followers, following: rough signs of how active and connected the account is.

Organisation memberships only appear if the user made them public, so an empty list proves nothing. The languages across someone's repositories give a quick sense of their skills and can help separate two people who share a name.

Commit emails and the .patch trick

Every Git commit records an author name and email. GitHub's web interface hides the email, but the raw commit does not. Add .patch to any commit URL and you get the commit as plain text:

commit.patch
https://github.com/jdoe-dev/example-repo/commit/<sha>.patch

From 3f2a9c1e... Mon Sep 17 00:00:00 2001
From: Jane Doe <jane.doe@example.com>
Date: Tue, 14 Jul 2026 22:41:07 +0200
Subject: [PATCH] Fix pagination in export

Three things to take from those header lines:

  • The email is whatever the committer typed into git config user.email: a work address, a personal one, or a GitHub noreply address.
  • The name can differ from the profile. People often commit under their legal name while using a handle on the profile.
  • The date carries a UTC offset (+0200 here), taken from the committer's machine.
Flowchart: from a commit and its .patch file, ask whether the address is a noreply address; if yes it is a dead end. If not, ask whether the commit is the subject's own; if unsure, do not attribute it. If yes, run an email search and breach check.
Before an address leaves the patch file and enters your notes, it has to pass two questions.

Careful: Only use commits from the user's own repositories, or commits you can clearly attribute to them. In a fork or a shared repository the author may be someone else entirely, and pinning their email on your subject is the classic mistake. Anyone can commit under any name and address, so confirm the email independently, for example with an email investigation, before relying on it.

SSH and GPG keys

GitHub publishes each user's public SSH keys at https://github.com/jdoe-dev.keys and public GPG keys at https://github.com/jdoe-dev.gpg. Public keys are meant to be public, so this is not a leak, but it is handy for correlation:

  • The same SSH public key on two accounts strongly suggests one person or one machine controls both.
  • A GPG key can carry user IDs with names and emails that differ from the profile.
  • The number and type of keys hints at how many machines someone uses, though you should not read much into it.

Compare keys by full value or fingerprint, never by the comment at the end of an SSH key line. That comment is free text anyone can edit.

Reading activity time zones

The UTC offsets in commit timestamps, and the hours someone usually commits, point to a likely time zone. Collect the Date lines from a set of the user's own commits and plot them by hour. This is the shape you are looking for:

Bar chart of commits by hour of day for the fictional account jdoe-dev, at a +0100 offset. Activity is near zero from 02:00 to 06:00, climbs at 08:00, peaks at 10:00 to 16:00, dips at 12:00, and has a smaller evening bump at 18:00 to 20:00.
Fictional commit history for jdoe-dev, read in the committer's own offset. A quiet night, a working day with a lunch dip and a smaller evening bump: consistent with someone on +0100.
SignalWhat it can suggestCaveat
Consistent offset, e.g. +0200Machine clock set to a zone with that offsetServers, CI systems and VMs often use UTC
Offset flips between +0100 and +0200A region that observes daylight savingTravel produces the same pattern
Commits cluster 09:00 to 18:00 localWork-hour activityRebases and amended commits keep or reset dates
Late-night clustersHobby or side-project workSays little about where the person is

Use this to sanity-check claims. A profile that says "Based in Berlin" while every commit carries -0700 is worth a question. Do not use it to pin down where someone physically is: a time zone covers millions of people, and treating it as a location is both inaccurate and the wrong use of the technique.

Worked example

The candidate's link points to jdoe-dev. The API shows account ID 12345678, created in 2016, company "Example Corp", location "Berlin". That matches the CV. A commit in their own repository shows jane.doe@example.com and a +0100 offset, with commits clustered from 08:00 to 17:00 on weekdays. Consistent.

Then one of the "ten years" fails: the repositories listed as the candidate's flagship project are forks, and the commits the candidate claims are authored by someone else. The profile is real; the claim is partly not. The recruiter asks about it instead of rejecting on a hunch.

Doing this at scale

By hand, all of the above is a dozen API calls and a spreadsheet. TraceFind's GitHub investigation pulls the public profile in one step: numeric ID, creation date, company, location, blog, SSH keys, organisations, languages, and the names and emails used in the user's own public commits. When a username search or an email search finds a GitHub profile, the investigation starts on its own and the details appear with the result. Lookups are passive: the account owner is not notified.

Each finding can go onto the investigation canvas as a linked entity, so a commit email becomes a node you can pivot from into an email search.

The TraceFind investigation canvas with a GitHub account node jdoe-dev selected. It is linked to a username, a name node John Doe, the email j.doe@example.com, which is in turn linked to two breaches and a Spotify registration. A note reads: same avatar on GitHub and WhatsApp, likely the same person. The right panel shows the entity properties and an Investigate GitHub account button.
The GitHub account as a node on the canvas. The side panel has an "Investigate GitHub account" button and a username search shortcut, and the yellow note records why two accounts were linked.

Start from a username. Search a handle across about 1,000 sites and get GitHub profile details automatically when an account turns up.

Run a username search

If you are the developer: what to change

If you read this with some unease, the fixes are short and GitHub documents them well.

  1. Use your noreply address

    Every account has one in the form ID+username@users.noreply.github.com. In your email settings, turn on Keep my email addresses private, then set it locally too:

    bash
    git config --global user.email "12345678+jdoe-dev@users.noreply.github.com"
  2. Block pushes that expose your email

    Also enable Block command line pushes that expose my email. GitHub then rejects a push containing commits made with your private address, which catches the day you forget to configure a new laptop.

  3. Separate work and personal identities

    Use Git's conditional includes so repositories under a work directory use your work identity and everything else uses the noreply address. A weekend project then never carries your employer's domain.

  4. Review what is already public

    • Open a few .patch files from your older repositories and see which emails appear
    • Hide public organisation memberships you do not want listed
    • Remove SSH keys you no longer use (good hygiene anyway)
    • Keep the location and company fields vague

Rewriting history to change the author email changes every commit hash and breaks other people's clones, and forks keep the original commits. For most people the practical choice is to switch to the noreply address going forward and accept that old commits stay. For a wider self-audit, see how to find and shrink your digital footprint.

Frequently asked questions

Can you find someone's email address from their GitHub account?

Often, yes. Appending .patch to a commit URL shows the author name and email from the commit. It only reveals what the person configured in Git, which may be a GitHub noreply address, and it should be verified independently.

How do I hide my email address on GitHub?

Enable Keep my email addresses private and Block command line pushes that expose my email in your GitHub email settings, and set your local git user.email to your ID+username@users.noreply.github.com address.

Does GitHub notify a user when someone views their profile or keys?

No. Public profiles, .patch files and .keys pages are ordinary public pages, and TraceFind lookups are passive, so the account owner is not notified.

Do commit timestamps reveal where a developer lives?

No. A UTC offset only suggests the time zone setting of the machine that made the commit. It is useful for checking whether a claim is consistent, not for locating a person.

What stays the same if a GitHub user renames their account?

The numeric account ID. Record it from the API response and you can recognise the account later under a new handle.