This map is wrong in places. If you know one of these chains, you can fix it faster than anyone here can.
Substrata is an open research project mapping the constraints on building more compute, more power, better materials and better machines. Everything is public: the data, the method, the code, and the list of what has not been checked.
It is early, and the parts that need expert knowledge are exactly the parts an outsider cannot verify from a desk. Which of five wafer makers actually ships prime 300 mm at volume. Whether a lead time quoted in a press release is the one a buyer really gets. Which step of a magnet supply chain the export controls actually bite on. People who do this work know those answers already.
What an invitation to contribute is, and what it is not. Said first rather than in the small print.
This is not a job and not employment
There is no vacancy, no contract, no salary and no obligation on either side. It is an invitation to contribute knowledge to an open-source project, in whatever amount suits you, and to stop whenever you like.
Nobody is paid, including the people running it
Substrata has no revenue and pays nobody. If that ever changes, this page will say so before anything else does.
Your contribution is public, and credited
Contributions arrive as public issues or pull requests under your own name, and the commit history is the record. If you would rather not be named, say so and the change goes in without attribution.
Do not send anything confidential
Everything here is public the moment it is filed. If a fact is under an agreement with your employer, it does not belong on this site. Published sources only.
02
Knowledge this project is short of
Each of these is a real gap. If one of them is your day job, you can close it faster than anyone here can.
People who work in a supply chain we cover
Read the maker list for one material and tell us which rows are wrong, which firms are missing, and which of them actually ship the qualified grade rather than the commodity one. Every maker row without a source is marked unverified, and those rows are exactly where trade knowledge beats desk research. /data counts how many there are today.
A single correction
Power and grid engineers
Correct the transformer, interconnection and switchgear rows: real lead times, what a queue position actually means, and which reforms have changed anything on the ground. Energy is where this research thinks the binding constraint sits.
Now and then
Semiconductor process and equipment people
Check the lithography, packaging, memory and resist entries, and say where the severity scores are wrong and why. These rows drive most of the map, and every score on them is still a single judgement, not yet checked by anyone who works in the field.
Now and then
Trade and export-control lawyers
Check the policy entries against the instruments themselves: scope, status, what was suspended, and what a measure does rather than what the coverage of it said. Five of the twelve rules were described wrongly in the first draft; a specialist would catch the next five faster.
Now and then
Materials scientists and process engineers
Check the readiness judgements in the science section against their sources, or argue a number down with a reason. Every readiness score cites a source, and each is still a single judgement of what that source shows.
A single correction
People who can write clearly about hard things
Write a note: what one part of the map implies, where the research is weak, or what a recent event actually changed. The map states facts; the notes are where the reasoning gets argued with in public.
Now and then
Engineers who want to work on the machinery
Improve the research engine: better search, better candidate ranking, a policy sweep, or the scoring system that will judge this project’s own calls. The automated sweep files candidates a person then reads. It is crude, and every improvement to it multiplies what one reader can verify.
An ongoing part of the work
03
What happens when you write in
The routes above, and what follows each one — so nobody is left waiting on a reply that was never coming.
Correct a row on GitHub
Opens a prefilled issue. It is read and either applied or answered in public, usually within a few days. Needs a GitHub account.
github.com
Offer your expertise
Opens a prefilled issue describing what you know and which part you could check. You get a reply saying which rows would benefit most.
github.com
Send a pull request
Every fact on this site is a file in the repository. A change to a row is a change to a config file, and the tests will tell you if it breaks a rule.
github.com
04
Questions
I only have one fact. Is that worth sending?+
Yes, and it is the most useful size of contribution. One corrected row from somebody who knows a chain is worth more than a general opinion about the whole map.
Can I contribute without being named?+
Yes. Say so in the issue and the change goes in without attribution. The source still has to be public, because the row has to be checkable by the next reader.
Will this ever pay?+
There is no revenue and no plan that depends on one. If that changes, this page changes first, and anybody who contributed before it changed will be told rather than discovering it.
What if I disagree with a severity score rather than a fact?+
Say so. Every score carries the reasoning next to it precisely so it can be argued with, and an argument that changes a score is recorded like any other correction.
I work for one of the companies on the map. Is that a conflict?+
It is worth disclosing in the issue, and it is not disqualifying. Send published sources rather than anything internal, and the disclosure travels with the change.
05
Credit
Everything sent in arrives as a public issue or pull request, so the record of who improved what is the repository history rather than a page anyone here maintains. Corrections are the reason this research is published rather than kept.
Computed: For each resolved holding: the bottlenecks its companies hold (maker, capacity or part supplier), the ones a filing says they need or sell into, and everything upstream of a held or needed rail through recorded "needs" rows.Computed: Sum of the weights of the holdings that touch a rail, divided by the sum of the weights of all resolved holdings. With no weights given, every holding counts equally.Computed: For each country: the share of portfolio weight on a rail whose every recorded maker operates there, and the share on a rail with at least one recorded maker there. Part suppliers are not makers.Computed: Direct hits: bottlenecks where the failed node is a maker, a part supplier or the location. Makers wholly inside it are lost; makers also operating elsewhere are partly affected; the rest remain. Downstream: every bottleneck that needs a hit one, transitively, through recorded rows. Exposed: holders of hit and downstream bottlenecks and companies a filing says need or sell into them.Computed: The country’s recorded annual production divided by the recorded world total for the same year and unit, from config/substrata-quantities.ts (USGS).Computed: Rows that held over rows looked at, pooled across every check of that criterion for that dataset, rounded down to a tenth of a percent.Computed: The mean of the criterion scores that could be measured for the dataset.Computed: Rows: judged by the dataset’s first provenance check. Sourced: share of those that pass it. Verified: rows re-derived from their source by a network look, over every row such a look covers. Stale: rows past their declared age. Broken: source links that failed three tries.Computed: Tokens per UTC day on this site's free AI keys, summed per class: interactive (Ask and fact-checks, a reader waiting) and background. Background is zero from 2026-09-25: no scheduled job may call the free models, and test/no-free-background-ai.test.ts fails the build if one tries. Drafting runs on readers' own keys and is not on this ledger.Computed: Over every Ask question in the last 24 hours that got an answer: the 50th and 90th percentile (continuous, PostgreSQL percentile_cont) of milliseconds from the request reaching the server to the first answer text streamed, and to the finished answer.Computed: Count of rows in the bottleneck corpus: every material plus every non-material chokepoint.Computed: Count of bottlenecks whose assessed horizon is "now".Computed: Sum of four judged scores, each 0–3: concentration + substitution + lead time + inelasticity.Computed: Count of (bottleneck, producer) pairs across every material in the corpus.Computed: Producer rows counted by verification state from the corpus: sourced (an accepted primary source is linked) or unverified (none yet). Unchecked pages: open rows in the producer-sourcing queue, counted live from the database.Computed: Count of rows in the market-participant directory.Computed: Count of bottlenecks on which this organisation is recorded as a producer, a holder of the capacity, or a supplier of a critical part.Computed: Accepted events that name this organisation, plus (counted separately) accepted events on a bottleneck it holds that do not name it.Computed: Count of policy instruments in the corpus; each one links its official text.Computed: Count of science entries: technologies recorded as able to relieve a named bottleneck.Computed: Accepted events whose date falls within the last N days of today.Computed: Leads in the research sweep’s queue that no person has read yet and that have not expired, counted live from the database.Computed: Waiting: open sweep leads — no reviewer decision, not expired. Oldest: whole days since the earliest open one was found. Drafts ready: waiting leads whose AI draft suggests an event and passed the checks.Computed: Count of bottlenecks tagged with that technology, industry or stage.Computed: Number of distinct country codes on the rows being counted (makers, or rules).Computed: Rules counted by the effect recorded on each: "tightens" slows building, "loosens" speeds it; a rule recorded as both ways is counted in neither.Computed: Rules with at least one proponent: an organisation that asked for it in a document linked on the row.Computed: A judged level on a nine-step scale from "idea with a physical basis" (1) to "in production at scale" (9).Computed: Technologies tracked = science entries; bottlenecks addressed = distinct bottlenecks named as relieved by any entry; reaching production = entries judged 8 or 9; sourced = entries whose readiness cites a source.Computed: Kinds = rows in the capital-kinds list; providers = named funders, each linking its own mandate page; assessed = bottlenecks with a funding judgement; "money is not it" = those judged "not-money".Computed: Open = calls without a resolution; resolved = right + wrong + unclear; overdue = past the resolve-by date and not yet marked; hit rate = right ÷ (right + wrong), published only once enough calls have resolved.Computed: Bottlenecks on that stage of the loop, and how many of them have every producer row sourced.Computed: The highest severity score among the bottlenecks recorded as gates on the loop.Computed: Count of explainer files in content/learn, and of entries in the glossary.Computed: A place's annual production ÷ the published world total, same unit and year.Computed: Sum of the squares of each producer’s share of world output (0–1).Computed: Published reserves ÷ annual production, same place, unit and year.Computed: Accepted events in the last 90 days that tighten it, minus those that loosen it. Neutral events count for neither.Computed: One row per (bottleneck, holder) after the screen’s filters; the bottleneck count is the distinct bottlenecks among those rows.Computed: Organisations recorded on a bottleneck (maker, capacity holder or part supplier) whose shares, or a parent’s, trade on an exchange found in the SEC ticker file or OpenFIGI.Computed: Items per stage = papers, preprints and grants collected for the bottleneck whose relevance score is 2 or more, placed on a stage by the rule in lib/science.ts; judgements are counted separately.Computed: Items first collected in the last 7 days whose publication or award date is within the last 30 days.Computed: Items per institution per bottleneck, counting each item once per institution named on it by the source; a company is matched to the directory only when every distinguishing word of both names agrees.Computed: The latest value in a series minus the value before it, divided by the earlier value, same series and unit.Computed: Count of dated values in a series, or of series matching the filters, across the committed corpus and the official statistics fetched on schedule.Computed: Count of postings currently listed on the public job boards Substrata reads, after the page’s filters. By default software and business roles that name no bottleneck are left out; "Every role" puts them back.Computed: A posting is filed under a bottleneck when its title names one of that bottleneck’s terms, or its description names them at least twice (title only for software and business roles); its role family is the first family whose title terms its title names.Computed: For each skill or credential in the published list, the number of open postings whose title or description names any of its terms.Computed: Count of programmes in research/learning-paths.json, each with the official page it was checked on.Computed: A feed is fresh within one scheduled interval plus half an interval (at least 20 minutes) of its last good run, late up to three intervals, stale beyond; failing when its newest failure is newer than its last good run.Computed: Now minus the finish time of the last good run (feeds), or whole UTC days since the date the committed file records it was checked (datasets).Computed: A sweep lead is open while nobody has reviewed it and it was found less than 30 days ago; unreviewed and 30 days or older, it is expired. The review queue is open leads only: late when its oldest has waited more than 7 days, stale past 31.Computed: Position of a country when the countries USGS lists individually are sorted by the same column, largest first; equal values share a rank.Computed: Latest year ÷ the year before − 1, same country, same column of the same table (USGS or EIA).Computed: A country's resources are ordered by its largest share of world output on any production column of each table (e.g. palladium within PGMs).