About the data
This page is published. It is the answer to "where did this number come from", and it is what the landscape reports cite.
Observed public open-source crypto activity by developers placed in Nigeria, Kenya and South Africa, with Egypt and Ghana as comparators, per quarter, per calendar year and per month.
Not a developer count. Not a national total. Not complete continental coverage: the overview is labelled "Tracked African markets" for that reason. Not a measure of quality.
Contributions by these developers to global projects count: a developer is placed by where they are, not by where the project is.
Tracked African markets is Nigeria, Kenya and South Africa together, each developer counted once. Every developer is placed in at most one country, so it is exactly the sum of the three, and the pipeline checks that it is. Egypt and Ghana are comparators: shown beside the markets for context, never added into the total.
Each scope (the five countries and Tracked African markets) carries the same measures: active developers by contribution intensity, by tenure and by single versus multichain; changes on the previous quarter and a year earlier; retention; newcomer retention; progression from occasional to sustained contribution; ecosystem participation; and new developers and repositories by month.
Primary source is Open Dev Data by Electric Capital (CC BY 4.0): 489 million commits, 3.5 million deduplicated developer identities, 100.8 million daily developer-by-repository activity rows covering 2008 to the present, 13,328 ecosystems, and geocoded developer locations.
Identity deduplication, bot detection, fork exclusion by commit fingerprinting, and country geocoding are performed upstream. We consume the derived country field only, never the raw geocoding payloads.
Upstream rebuilds daily and does not retain superseded snapshots, so each quarter's core tables are archived to object storage with a SHA-256 manifest. Every published figure names the snapshot it came from.
Published verbatim. These are also the rows in metric_definitions, so the definition a reader sees is the definition the figure was computed against.
| Term | Definition |
|---|---|
| Qualifying contribution | An original code commit authored by the developer, in a non-fork public repository, excluding merge commits and bots |
| Active developer (quarter) | Distinct developers with a contribution in the quarter. Never a sum of months |
| Active developer (year) | Distinct developers with a contribution in the calendar year, each counted once however many quarters they were active in. The current year is shown "to date" |
| Contribution day | A distinct date with at least one qualifying contribution |
| Occasional contributor | Fewer than 10 contribution days in the quarter |
| Sustained contributor | 10 to 49 contribution days in the quarter |
| Heavy contributor | 50 or more contribution days in the quarter |
| Tenure | Time from a developer's first contribution to the end of the quarter: under 1 year, 1 to 2 years, 2 years or more |
| Multichain | Contributing to two or more chains in the quarter |
| Retention | Of the developers active in the previous quarter, the share active in this one |
| Newcomer retention | Of the developers whose first contribution fell in a quarter, the share active again the next quarter, and a year later |
| Progression | Of the occasional contributors in the previous quarter who are still active, the share contributing on 10 or more days this quarter |
| Attributed developer | In the confirmed or declared tier |
The three intensity bands are a partition. They sum to the total, and a developer appears in exactly one. An earlier internal draft defined sustained as "10 or more days", which makes heavy a subset of sustained; figures computed that way do not sum and must not be stacked.
Contribution intensity is activity, not employment. Someone contributing on 50 days a quarter is not necessarily employed full-time in Web3, and someone contributing occasionally may be a full-time engineer whose work is private. The bands describe what is visible in public code, nothing more.
Bands and tenure are published per quarter. A year carries active developers, ecosystem participation and its change on the year before only: the quarterly thresholds do not carry over to a year.
The share of active developers contributing to an ecosystem is the number of a scope's active developers who contributed to it in the period, divided by all active developers in the same scope and period. For Tracked African markets the denominator is the three markets' active developers together; for Nigeria, Nigeria's. Every page states its denominator beside the shares.
A developer counts for an ecosystem when they contribute to any project in it, as Electric Capital files its projects: a project of Base counts for Base and for Ethereum, which contains it. This is inherited membership, the union of Electric Capital's recursive membership table and its direct tags (the recursive table is computed a few days before the direct one is exported and misses the newest tags). It makes "Ethereum" mean what a reader expects: in Q2 2026, 26.0% of tracked active developers by inherited membership against 11.5% counting only repositories tagged to Ethereum itself.
Developers contribute to several ecosystems, so the shares add up to more than 100% and are drawn as independent bars, never stacked. Stacks (EVM Stack, SVM Stack and the like) group ecosystems that share a technology and are tagged as such.
A market's share of the tracked markets' contributors to an ecosystem is a different measure: of all developers in Nigeria, Kenya and South Africa contributing to the ecosystem, the share in that country. It is always labelled separately from participation.
Recent months rise in later releases, because the source keeps adding older projects: 90% of the developers whose first contribution fell in 2019 were only added to the dataset later. The months of the latest two quarters are therefore drawn as provisional.
Four tiers. A country is never silently assigned.
| Tier | Basis | Use |
|---|---|---|
| Confirmed | The developer told us, or a partner organisation vouched | Headline figures |
| Declared | A profile location that geocoded cleanly, either by Electric Capital or by our gazetteer from the developer's public GitHub profile (below) | Headline figures, reported separately from confirmed |
| Probable | Two or more agreeing weak signals | Sensitivity band only, never a headline |
| Unknown | Everything else, including failed geocodes | Cannot be placed in any country, so never counted for any country |
Confirmed and declared are separated because they are different evidence: a developer who told us where they live, versus a string on a profile that a geocoder resolved. The ratio between them is itself a quality signal.
Electric Capital leaves many developers without a country. For every one of them active since 2015 who has a GitHub account, we read the location on the public GitHub profile and match it against a gazetteer built from Electric Capital's own geocoded places: every city and region it placed in the five countries. A place name counts on its own only when at least 90% of the developers Electric Capital placed under it, and of the location strings that contain it, are in one country; "Lagos" counts on its own, "Victoria" and "George" only beside their country's name. A string that names two countries, or one of ours beside any other, is rejected rather than guessed.
Measured against Electric Capital's geocoder on every location string it placed, the gazetteer agrees on 97.9% of strings it placed in the five countries, and places 0.004% of strings it placed elsewhere in one of ours.
Developers found this way are in the declared tier, count in every figure and in the coverage rate, and never override Electric Capital's own placement. Accounts are looked up by GitHub's permanent account ID, so a renamed account cannot be confused with whoever later took its name.
It slightly overstates growth. Every developer active since 2015 is looked up, but profiles are read as they are today, and people who left GitHub years ago rarely keep a location there. So the share found this way rises towards the present: in the first run (6 October 2026, 720 developers across the five countries) it was about 1% of a country's active developers in 2018, 2% in 2020 to 2022, and 4 to 6% in 2024 to 2026. Growth from 2018 to 2026 is overstated by roughly that difference, a few percent, against real growth of several times over. Every figure is still an observed minimum. Each release's notes give the share by country and year, the number found per country, the date the profiles were read, and the file's checksum.
Timezone is never used to assign a tier. Commit timestamp offsets are computable at scale and the signal is real, but inferring residence from commit timing is behavioural profiling, which Nigeria's GAID Art. 26(2)(d) requires us to eliminate. It is used only to flag candidates for the confirmation campaign.
A developer is counted for a country only when a public profile location places them there. Electric Capital places about 40% of all active developers worldwide in some country (38.7% in Q3 2026); the rest have not declared a location anywhere public, and no dataset knows where someone lives when they have not said. Reading GitHub profile locations recovers a small share more, not the majority.
That rate is a property of the whole dataset, not of any country. How many of the unplaced developers live in Nigeria cannot be observed, so none are assigned to Nigeria, and the rate is never presented as a country's coverage. Every country figure counts placed developers only and is therefore an observed minimum, shown as "at least".
Releases before 2026-Q4 (contract v3) published a range for each count, from the observed count to the count divided by the worldwide placement rate, and comparators always as ranges. The upper end assumed a country's unplaced developers are in the same proportion as worldwide, which cannot be checked. Since release 2026-Q4 every count, for markets and comparators alike, is the observed minimum alone.
A share is published only when its denominator is at least 50 developers and its numerator at least 5; below that a percentage swings on two or three people. A count of fewer than 5 developers in one ecosystem in a country is not published either. Both show as "not published".
A headline that rises because we found more people is not growth. Two series are published side by side:
The gap between them is the discovery effect, stated rather than absorbed.
A period may be withheld where the underlying data is not yet trustworthy. At launch this applies to recent quarters affected by an unexplained drop that may be upstream pipeline lag rather than a real decline.
The rule, applied to every country and quarter from the fifth quarter of history onwards: a quarter is withheld when the country's share of all active developers falls more than 25% below its average share over the previous four quarters. A fall of that size while the global total holds points to a lag in locating recent developers, not a real decline. The rule applies only where the country averaged at least 50 active developers over those four quarters; below that, a swing of a few developers is noise rather than lag. Every month inside a withheld quarter is withheld with it, and so is any year containing it. Tracked African markets is withheld for a quarter when any of the three markets is. A publisher may publish a quarter the rule would withhold, per country and release; the release notes record each one. Each release's notes list every quarter the rule withheld. A measure that depends on a withheld quarter, such as retention into the next quarter, is suppressed with it.
Withheld periods render as a labelled break in every chart, with a link to the reason. They are never omitted: a line that closes the gap would assert continuity the data does not support.
Backfill and upstream rebuilds restate history. Every figure carries a restatement flag, and every release ships a revision-log entry naming what moved and why. The log is generated by diffing consecutive release bundles, so it cannot disagree with the data.
Electric Capital's worldwide series (the former Global page, worldwide ecosystem series, developer types and each country's share of the world) are no longer published: the dashboard reports the tracked African markets only. Releases before 2026-Q4 that contain them stay in the database unchanged.
Each country page also shows GitHub's own figures from its Innovation Graph (CC0): GitHub accounts, organisations, repositories and pushes per quarter, and the top languages, repository topics and collaborating economies. They cover every public GitHub account GitHub places in the country, crypto or not, and include inactive accounts. GitHub places accounts by its own method, not by the profile location Electric Capital uses, so these figures are context for scale, never our denominator. The "world" total is the sum of every economy GitHub publishes, excluding its EU aggregate.
Crypto developers per 100,000 GitHub accounts divides our observed crypto developers in the quarter by GitHub's account count, for the three markets. It is a lower bound, shown as "at least": the numerator is an observed minimum. It is not published for comparators, nor for a withheld quarter.
Hackathon figures are a separate section. They are never added into active developers or any other open-source count, and the headline is unchanged by them.
Sources.
data-sources/devfolio_hackathons.csv. Events found only through web3 sponsors (mostly general college hackathons) are excluded.data-sources/hackathons/), published as the organiser reported them under their own metric names.Who counts. A participant is a member of a submitted project; the platforms do not show people who registered and submitted nothing (Devfolio's registration count is shown per event, for every country together). A participant is placed in a country by the location on their public GitHub profile, with the same gazetteer as the open-source figures. Devfolio's own address field is never read. Someone without a placeable GitHub profile is not counted, so every platform figure is an observed minimum.
Periods. An event belongs to the quarter, and the year, in which it ended. A yearly participant count is distinct people: someone at three hackathons in a year counts once.
Linked to open source, by GitHub account. Two shares connect the sections without merging them:
Both follow the small-share rule (at least 50 participants, at least 5 in the numerator). A count under 5 is not published.
Electric Capital's own country shares are not reproduced. Its published shares depend on an eligibility filter that uses market-capitalisation data not present in the open dataset, so they cannot be rebuilt from the source.
Earlier survey findings in Hashed Emergent's published reports come from a different source and are not comparable, figure for figure, with the observed activity here.
See limitations.md.