An open dataset of every SF Bay Area and Los Angeles private raise filed with the SEC on Form D since 2019, rebuilt from the SEC's free quarterly data sets, plus a static dashboard (Observable Framework, DuckDB in the browser) for GitHub Pages. Total cost: $0.
Nothing needs to run on your own computer. A GitHub Actions workflow
(.github/workflows/refresh.yml) runs daily at 09:00 UTC, or on demand from the Actions
tab, and does the following:
- Rebuilds the database from the SEC.
- Checks new companies' homepages for AI evidence (up to 3 hours per run).
- Sends ambiguous homepages to Claude through the Batches API, up to
CLAUDE_MAX_USDof estimated spend per run (default $10); the rest wait for later runs. - Commits the small
data/enrich/results back to the repo. - Loads BigQuery through keyless Workload Identity Federation.
- Publishes the website to GitHub Pages.
The nationwide AI pass finishes over a few daily runs; after that each run only handles new filings.
Repository settings it relies on:
- Secrets:
SEC_USER_AGENT,ANTHROPIC_API_KEY(scripts/set-secret.shsets one from a TextEdit window, or use Settings → Secrets → Actions) - Variables:
BQ_PROJECT,GCP_WIF_PROVIDER,GCP_SA_EMAIL, optionalCLAUDE_MAX_USD - Pages: source set to GitHub Actions
The Google service account can write only to the formd dataset and run BigQuery jobs.
- Data: every Form D filed in the US since 2019.
- Up close: ten metros, defined by county in
config/geo.yaml: SF Bay Area, New York City, Los Angeles, Boston, Seattle, Austin, Chicago, San Diego, Miami and Denver–Boulder. - Adding a metro: add its counties, a bounding box and a map view to
geo.yaml, then rebuild. The site picks it up automatically. - Platform addresses: about 25,000 SPVs that file from a platform administrator's
office are kept out of the metros (
sql/28_platform_addresses.sql). AngelList's Belltower in Seattle alone files thousands. An address shared by 200+ issuers that are at least 80% SPV-named counts as a platform address.
review/app/label-desk.html is published as a private Claude artifact. It shows one
company at a time with links to its homepage and SEC filings. You answer first: "AI
company?" or "fund or startup?". Only then does it reveal what the tool said and why,
so the accuracy you measure isn't biased by the tool's answer. It keeps a running
precision/recall, shows agreement when a second reviewer (shared as Contributor) labels
the same items, and exports a CSV. To score the labels and feed them into the
Methodology page:
uv run python -m pipeline.review import form-d-labels.csv
uv run python -m pipeline.review ai-score
uv run python -m pipeline.review scoreSmaller sample. Labelling all 500 isn't needed. About 200 AI items (100 tagged AI,
100 not) and 50 fund/startup items give accuracy figures within about ±7 points.
pipeline.review focus gives each Desk item a route. todo is a seeded random top-up to
those targets. recheck is an earlier label to look at again (review/recheck.csv),
shown first and blind. later is hidden from the Desk's "Needs you" view.
Items left unanswered or marked "Can't tell" were removed from the sample at the
reviewer's request (review/excluded.csv); they stay in the dataset, uncounted in scores.
Hand-labelling all 500 items isn't needed. pipeline/jev.py asks Jev (TypeSafe AI's
decision model) the same question the reviewer answers, using the filing details and
homepage text. Jev never sees the tagger's call. Claude can't play this role, because
Claude is already the tagger's tie-break judge and would be grading itself.
Each item you haven't labelled gets a route:
- disagree: Jev and the tagger differ. The Desk shows both calls and you pick.
- low_conf: they agree, but Jev's confidence is below 0.8. You decide blind.
- blind: a seeded random draw of confident agreements (40 AI, 10 fund/startup). You decide blind. This measures how often both are wrong together.
- auto: a confident agreement. The shared answer counts as the label.
The Desk's "Needs you" view shows only the first three routes.
uv sync --group jev # the Jev SDK is optional since 2026-10-25
scripts/set-key.sh # saves TYPESAFE_API_KEY to .env, hidden
uv run python -m pipeline.jev run # Jev's answers -> review/jev_labels.csv
uv run python -m pipeline.jev calibrate # Jev vs your labels: trust it first?
uv run python -m pipeline.jev sweep # review/sweep.csv with each item's route
uv run python -m pipeline.jev score # tagger accuracy from your labels + autoResult (2026-10-19): not used for labels. On the 134 hand-labelled AI items, Jev
(jev-1.13.0) agreed with the reviewer 75% of the time and the tagger 83%. Jev found 34
of 63 AI companies. A rewritten prompt with examples, plus a probability cutoff, was
tuned on a frozen half of those labels (review/jev_split.csv) and reached 90% there.
On the held-out half it scored 82% against the tagger's 83%. Where the two confidently
agreed, both were wrong 13% of the time. That error rate is too high to auto-accept
labels, so the review samples stay hand-labelled.
cp .env.example .env # put your name + email in SEC_USER_AGENT
uv sync
uv run python -m pipeline.buildThe first build downloads about 100 MB (30 quarterly ZIPs plus the Census ZIP-to-county
file), then fetches every Form D filed since the latest quarterly ZIP from EDGAR (about
16,000 XML files per quarter, roughly an hour). It never exceeds 5 requests/second and
caches everything under data/cache/. Later builds fetch only new filings;
--skip-download works fully offline.
| Command | What it does |
|---|---|
uv run python -m pipeline.build |
download → EDGAR filings since the last ZIP → load → sql/*.sql → data checks |
uv run python -m pipeline.daily |
fetch only the filings since the latest quarterly ZIP |
uv run python -m pipeline.build --sql-only |
rerun the SQL layer on already-loaded raw tables |
uv run python -m pipeline.checks |
data checks only |
uv run python -m pipeline.lookup "Databricks" |
one issuer's offerings and filings, with EDGAR links |
uv run python -m pipeline.verify_edgar |
compare the companies in review/spot_check.csv with EDGAR's live records |
uv run python -m pipeline.review sample / score |
100-row fund/startup/SPV review sample / score your labels |
uv run python -m pipeline.review ai-sample / ai-score |
400-company AI-tag sample / precision and recall from your labels |
uv run python -m pipeline.jev run / calibrate / sweep / score |
Jev second labeller: answers, check against your labels, review routes, scores |
uv run python -m pipeline.ai_tag |
AI evidence: YC directory, company homepages, local-model tie-break (writes data/enrich/) |
uv run python -m pipeline.geocode |
map coordinates for SF/LA issuers (Census geocoder, ZIP-centroid fallback) |
uv run python -m pipeline.adv |
Form ADV adviser files (exempt + registered), for matching fund managers |
uv run python -m pipeline.bigquery |
publish 10 tables to BigQuery with the bq CLI (BQ_PROJECT/BQ_DATASET in .env) |
uv run python -m pipeline.export |
site data (site/src/data/) and national downloads |
npm --prefix site run dev / build |
preview / build the dashboard (site/dist/) |
uv run pytest |
unit tests: amendment chains, name parsing, classification, AI tag, website layer |
A full local refresh, start to finish:
uv run python -m pipeline.build # SEC data -> database
uv run python -m pipeline.ai_tag # needs Ollama + llama3.2:3b for the tie-break (optional)
uv run python -m pipeline.geocode
uv run python -m pipeline.adv
uv run python -m pipeline.build --sql-only
uv run python -m pipeline.export
npm --prefix site run buildEverything lands in one file, data/formd.duckdb.
| Table | Grain | Notes |
|---|---|---|
raw_* (6) |
as shipped by the SEC | all text, plus source_quarter |
load_manifest |
one per quarter | quarterly ZIP or edgar_daily XML, and whether the quarter is complete |
filings |
one per accession (D or D/A) | typed; offering_id and link_method say how each filing joined its offering |
offerings |
one per raise | latest-filing amounts, first/last filing dates, days_open, fill_pct, flags, metro |
filing_increments |
one per filing | change in amount sold and investor count versus the prior filing in the same offering |
issuers |
one per CIK | latest address, county, metro, former names, EDGAR link |
offering_class |
one per offering | kind, vehicle_type, fund_bucket, fund_number, manager_key, security_class, is_startup_raise, plus the reason each rule fired |
managers |
one per fund manager | vehicle counts by type, highest fund number |
fund_families |
one per fund | parallel vehicles ("Fund I", "Fund I-A") collapsed; is_emerging |
manual_overrides |
one per correction | loaded from config/manual_overrides.csv |
issuer_people, people |
one per person per issuer / per person | names and roles from Form D; repeat founders, startup execs who later run VC funds, platform staff |
capital_momentum |
one per venture-stage startup | 0–100 capital score from recency, step-up, pace, fill speed, investors (percentiles within peer group) |
ai_signals, ai_tags |
evidence rows / one per CIK | every AI signal with its source; the resulting tier |
yc_matches, company_domains, web_signals, llm_labels, geocodes |
enrichment | loaded from data/enrich/*.parquet (committed snapshots of slow third-party lookups) |
zip_county, metro_counties |
lookups | Census 2020 ZCTA → county; metros from config/geo.yaml |
Offerings, not filings. A D/A's previous-accession field usually points at the
previous amendment, not the original (86k of 135k resolvable pointers), so we walk the
whole chain back to the root. The original D's accession becomes offering_id.
- Chains that leave the 2019+ window keep the out-of-window accession as their id and
are marked
began_before_window. Useis_new_in_windowwhen counting new raises, or 2017 funds filing annual amendments will look like 2023 raises. - External chains that enter the window at different points are merged on (CIK, first-sale date).
- A D/A with a broken pointer falls back to an earlier D from the same CIK with the same
first-sale date, then the same offering amount within 18 months. As of 2026-10-26 no
filing needs this: the 102 that used it were long chains cut off by the old 50-step
walk limit (see
docs/audit-2026-10-26-sec-links.md). - D/As that still can't be linked stay as
orphanofferings (0 as of 2026-10-26). - Hand-typed previous-accession numbers with dropped zeros ("001104659-21-005765") are padded back to 10-2-6 digits before the walk.
- Some issuers file the same original D twice. A new offering that matches an earlier one
from the same CIK on first-sale date, offering amount and amount sold, filed within 7
days of the previous copy, gets
duplicate_of(the earliest copy) and is left out of new-raise counts. Empty filings (no amount, nothing sold) never collapse. 541 offerings ($4.4B sold) collapse this way; the rows stay in the tables. - "Raised" is the latest
TOTALAMOUNTSOLD, never a sum. Decreases are kept and flagged as corrections.
Geography. The issuer's latest principal-office ZIP maps to a county, using the
county that holds most of the ZIP's land area. Typo'd or PO-box ZIPs fall back to the
county most issuers in the same city resolve to (at least 5 issuers, 80% agreement), then
to the dominant county of the 3-digit ZIP prefix. geo_method records which rule placed
each issuer. To add a metro, add its county FIPS codes to config/geo.yaml.
Flags, not deletions. Offerings at or above $100B (flag_implausible, e.g. typed
"$1 trillion sold") and sold-amount decreases are flagged and kept.
Freshness. The SEC's quarterly ZIPs lag by a quarter. For any quarter without a ZIP,
the pipeline reads EDGAR's form index, fetches each filing's primary_doc.xml, and
writes it in the quarterly layout, so both sources go through the same SQL. When the ZIP
for that quarter is published, it replaces the XML-built rows. On 400 filings present in
both sources, the parsed XML matched the ZIP on every offering field (amounts, dates,
exemptions, previous-accession pointers, security types). One difference favours the
XML: the ZIP's RELATEDPERSONS table copies one person's middle name and second street
line onto everyone else in the same filing. So people are matched on first and last
name only.
Fund or company. An offering is a fund if any of these hold: the issuer picked the
industry "Pooled Investment Fund", ticked pooled-fund interests, claimed an Investment
Company Act 3(c) exclusion, or has a vehicle name ("a Series of", "SPV", "Syndicate",
"Co-Invest", "– Series 4"). The name rule catches SPVs filed under other industries, such
as "Anthropic – a Series of Aurum VP Fund LLC", filed as "Other". Of the rest, real
estate industries become real_estate and "Investing" becomes other_investing, unless
the issuer is a corporation: fintech startups such as FalconX file as "Investing".
A non-corporation with a whole-word "Fund" in its name ("Hyla Fund III, LLC", filed as
"Other") is a fund, or other_investing under oil, gas and energy industries (drilling
and royalty programs); this moved 1,069 offerings to funds and 253 to other investing.
Everything else is an operating_company. rule_kind and rule_vehicle_type keep what
the rules said before hand overrides, so Methodology can grade the rules themselves. is_startup_raise keeps operating companies
selling equity or a SAFE/convertible (SAFEs usually appear as "option" or "other: SAFE").
SPV or blind pool. Among funds, vehicle names decide:
spv: SPV/series/syndicate names, or a single deal in parentheses ("OurCrowd (Investment in X)").spvalso covers deal-by-deal series: a manager that files 4+ distinct fund numbers within 12 months ("HCM G I" to "HCM G XX") isn't raising 20 funds.spvalso covers code families: 3+ vehicles whose names differ only by a short code, either a hyphenated prefix ("AL-D" / "CO-B" / "GW-E Ribbit Opportunity V, LLC") or, for LLCs, a trailing token ("FundersClub 6XV LLC", "Center15 Capital E LLC"). This beats a fund number. Roman numerals, vintage years, quarter classes ("Fund 8Q") and generic remainders ("ALF-III Capital Partners") don't count as codes.blind_pool: a fund number ("Accel XIV", "Partners Four"), or a fund word or vintage year ("Fund", "Opportunity", "Seed", "2023"), or an AngelList rolling-fund quarterly class ("Ravikant Capital, LP - G2").blind_poolalso covers an LP named like a manager, with nothing after "Capital", "Ventures" or "Partners" ("Indus Valley Capital, LP"). SPVs are mostly LLCs or carry a deal word.unclear: everything else; these go to review.
Vehicle rules, 2026-10-21. On the 35 hand-labelled funds, the code-family, rolling-fund
and manager-named-LP rules lift SPV vs blind pool from 17 to 20 correct (49% to 57%; 21
if "CO-B Ribbit Opportunity V" is relabelled SPV like its "AL-D" sibling). With n = 35 that
is indicative, not a measured rate. On all cached 2019–2025 fund filings they move about
1,250 rolling-fund classes and 1,370 LPs from unclear to blind_pool, and about 570
code-family vehicles to spv (160 of them from blind_pool). Rules tried and dropped:
a "Fund" word inside a platform series ("Embedding VC Palm Springs Fund, a series of
Decile SPV") would have flipped about 20,000 AngelList deal SPVs ("JU Fund I, a series of
Unpopular VC"); a bare "Series N" is still SPV because most such names are per-deal
series (EquityZen, AQR); offering duration and investor counts didn't separate the
labelled SPVs from blind pools. Those labelled exceptions stay in manual_overrides.csv.
Nationally, 67% of new "Venture Capital Fund" filings since 2019 are named as SPVs or series vehicles. In SF/LA the share is about 29%, because the big SPV platforms (AngelList-style series LLCs) file from Delaware addresses and fall outside both metros. Counting raw VC filings would still overstate new SF/LA funds by 1.4x–1.6x (3.0x–3.5x nationally).
Accuracy, 2026-10-22. With the hand overrides switched off, the rules alone get 20 of
the 35 labelled funds right. Of the 12 misses among rule-funds, 5 call a blind pool an SPV
and 2 the reverse, and 4 of the 5 left unclear are blind pools. So the site reports the
overcount as a range: the low end counts unclear vehicles as funds, the high end doesn't,
and the truth is likely nearer the low end. Further name rules weren't added: at n = 35 they
would be fitted to the sample.
Managers and emerging managers. manager_key is the fund name up to its fund number,
minus vehicle words. For example, "Andreessen Horowitz Fund IX – AI Infrastructure, L.P."
becomes "andreessen horowitz". Platform SPVs take the platform as manager ("X, a Series
of Rhone VC" becomes "rhone vc"). Names that start with letters and digits keep them
("n2 Venture Capital" becomes "n2 venture capital"). Generic stems ("capital partners") are not merged
across CIKs. Parallel vehicles with the same manager and fund number (or vintage year)
form one fund family. A family is emerging if it is Fund I–III; for unnumbered funds,
if the manager has at most two earlier families in the data. The Fund I–III cutoff is
our choice, matching common LP usage, and data that starts in 2019 can't see older funds.
Form ADV. Fund managers are matched to the SEC's monthly adviser files (exempt reporting and registered advisers that report private funds) on the same name stem. Adviser words ("Management", "Advisors", "GP") are dropped, so "Kindred Ventures Management, LLC" becomes "kindred ventures". Ties go to the adviser with a California office, then the one with the most private funds, and one-word stems match only California advisers. Each match adds:
- whether the adviser claims the venture-capital fund exemption (Form ADV 2B(1))
- its private-fund count and their gross assets
- the date it began reporting to the SEC
388 of 2,469 SF/LA venture managers match. Most emerging managers rely on state exemptions, or file under a name unlike their funds'.
Hand corrections. config/manual_overrides.csv (cik, offering_id, field, value, note) can set kind, vehicle_type, fund_bucket, manager_key or metro. Leave
offering_id blank to apply a row to every offering of that CIK. Overrides apply last,
and every edited offering lists the fields in overridden_fields.
Determinism. Every "pick the latest" step breaks ties on accession number, so identical inputs always produce identical tables.
uv run python -m pipeline.bigquery loads 10 tables into BQ_PROJECT:BQ_DATASET
(default dataset formd) with the Google Cloud bq CLI. The tables are offerings,
issuers, filings, filing_increments, fund_families, managers, people, issuer_people,
capital_momentum and ai_signals.
- Every run replaces every table, so the dataset always mirrors the latest build.
- NULLs are stripped from list columns, because BigQuery arrays can't hold them.
- A query on the BigQuery copy reconciles exactly with DuckDB: 285,868 offerings and $26,526,160,695,836 sold.
The target is the project in the BQ_PROJECT repository variable (shown as YOUR_PROJECT
below), dataset formd. That project has no billing, so it runs in the free BigQuery
sandbox, where tables expire 60 days after each load. The daily workflow reloads them, so
they stay live as long as it runs.
-- example: AI share of SF startup raises by year
select extract(year from first_filed) as yr, count(*) as raises, countif(is_ai) as ai
from `YOUR_PROJECT.formd.offerings`
where is_startup_raise and is_new_in_window and metro = 'sf_bay'
group by yr order by yrEach build fails if:
- a raw filing is lost
- an accession is duplicated
- a filing date fails to parse
- a filing has no offering
- dollar totals differ between the filing and offering layers
- a duplicate original is still counted as new, or points at a missing offering, another duplicate or a different CIK
It warns on:
- orphan amendments at 1% or more
- offerings spanning several CIKs
- flagged amounts
- quarter-over-quarter swings above 20%, except explained ones listed in
KNOWN_SWINGSinpipeline/checks.py(2021 Q1, the 2021 boom), which print as PASS with the reason - California issuers with no county
- unclear SF/LA VC vehicles at 20% or more
- override rows that match no CIK or offering
Classification checks fail the build if any offering lacks a kind, or any fund lacks a
vehicle_type or manager_key.
- Week 1: download, load, filings → offerings, data checks
- Week 1 gate, automated:
pipeline.verify_edgarcompares the spot-check companies with EDGAR - Week 2: EDGAR filings since the latest quarter; fund vs startup, SPV, managers, emerging managers
- Week 2 gate: 47 classification rows reviewed (fund vs company 91% right; SPV vs blind pool 20/35 by rules alone, reported as a range on the site)
- Week 3: AI tagging in four layers (name, YC directory, homepage text, quote-verified model tie-break)
- Week 3 gate: 205 AI items labelled (precision 83%, weighted recall 66%)
- Week 4: dashboard (
site/), map, coverage-gap study, downloads, daily GitHub Actions refresh - Published: https://lbb2005.github.io/formd-tracker/ (homepage AI checks cover 89–97% of startups in every metro)
- Findings page (
site/src/findings.md): the four takeaways, figures as of October 2026
Why not Evidence.dev: the plan named Evidence, but its open-source build is deprecated. The template now prints "npm run build is deprecated" and points to the hosted Evidence Studio CLI. Observable Framework does the same job: Markdown pages, SQL over Parquet with DuckDB in the browser, and a static build for GitHub Pages. It's open source (ISC) and maintained.
uv run python -m pipeline.verify_edgar checks every company in review/spot_check.csv.
- With a CIK: it confirms that every D and D/A EDGAR lists in our date range is in the database, and nothing else.
- Without a CIK: it searches EDGAR's full registrant list (
cik-lookup-data.txt) for names starting with the company name, separates SPV/fund vehicles from possible operating entities, and checks each candidate's whole EDGAR history for a Form D. That distinguishes "never filed" from "our pipeline dropped it". Databricks and Harvey AI serve as positive controls.
| Company | EDGAR vs ours |
|---|---|
| Databricks | 15 = 15 filings → 14 offerings |
| Figma | 5 = 5 → 5 |
| Notion Labs | 3 = 3 → 3 |
| Harvey AI | 6 = 6 → 6 |
| Vercel | 1 = 1 → 1 |
| Ramp Business Corp | 12 = 12 → 12 (NY address, outside both metros) |
| Perplexity AI | 1 = 1 → 1 ($28.8M; it has announced far more) |
| Replit | 1 = 1 → 1 ($0.3M; it has announced far more) |
| Anthropic | no operating entity on EDGAR; 34 SPV/fund vehicles named after it |
| OpenAI | no operating entity on EDGAR; 23 vehicles |
| Anduril Industries | no operating entity on EDGAR; 2 vehicles |
| Scale AI | no registrant of that name on EDGAR at all |
This is the start of the "coverage gap" finding. The best-known AI companies don't file Form D under their own names, but dozens of SPVs buying their shares do. The pipeline hasn't lost anything; the gap is in the source.
Definition, written before labelling: an AI company is one whose core product is an AI or ML model, or is built on one. Mentioning AI features does not qualify.
sql/40_ai_tag.sql turns evidence rows (ai_signals) into a tier:
strong: strong signals from two independent sourceslikely: one strong signalpossible: weak signals only
Layer 1, names. Strong name signals:
- a whole-word "AI" or "A.I."
- a ".ai" name ("Nowcasting.ai")
- a CamelCase suffix ("RelationalAI"); a lowercase "ai" ending is ignored, which keeps Ikigai and Elevai out
- the phrases artificial intelligence, machine/deep learning, LLM, GPT, agentic
Weak signals are "neural", "cognit-" and "intelligence". Former names count, which catches renames to and from AI names.
Layer 2, Y Combinator directory (public yc-oss mirror). A company is matched on a unique normalised name, then on a unique core name. AI-category tags are a strong signal, and the YC website gives a verified domain.
Layer 3, homepages. The universe is about 7,100 venture-stage SF/LA operating
companies, excluding restaurants, energy, travel and similar industries. The domain comes
from YC, or is guessed from the name (slug.com/.ai/.io/.co, get…, try…, …hq) and
accepted only if the company's distinctive name token appears in the page title,
description or headings, and the page isn't parked. Each page gets one polite request,
with robots.txt respected and a cache of 90 days. Scoring:
- strong: AI terms in the hero (title, meta description, top headings), six or more
in the body, or a
.aidomain known to be the company's own (from YC, or the name itself says AI). - weak: body mentions only, or a guessed
.aidomain.
Layer 4, model tie-break, for weak-only cases. In CI this is Claude Opus 5.5 through
the Message Batches API (pipeline/claude_judge.py, --judge claude, the default);
locally it can be llama3.2:3b through Ollama (--judge ollama, $0). Either model
answers yes/no/unclear and must quote the homepage phrase that shows the core product is
AI. A "yes" counts only if that quote appears verbatim, as whole words, in the text sent
and contains an AI term ("AI platform" doesn't verify against "OpenAI platform"). Without that check, the 3B model said "yes" to solar electronics, display optics
and a breathing-test device; with it, those become "no" and real AI companies still pass.
Earlier answers are reused from data/enrich/llm_labels.parquet, so CI runs without a
model keep them.
An ai_tier row in manual_overrides.csv wins over every rule
(strong | likely | possible | none). Funds get ai_theme instead of is_ai, as in
"Benchmark AI Infrastructure Fund" (in fact two vehicles raised only to invest in Cerebras, so
SPVs, but AI-themed all the same). Precision and recall come from your 400-row labelled
sample (pipeline.review ai-sample); the Methodology page shows them once labelled.
-
The AI tag looks backwards from today. Homepage, YC and model evidence describe a company as it is now, so a company that pivoted to AI in 2024 also counts as AI for its 2019 raise.
ai_name_at_filingis the time-correct alternative: AI in the issuer name as filed on that raise. In SF, startup raises by AI-named companies went from 1.2% (2019) to 10.4% (2026). By current evidence the share went from 18.3% to 36.7%. Show both; the truth sits between them. -
One issuer skews AI dollars. xAI is 40% of all SF startup dollars in 2026 ($16.6B of $41B). AI's dollar share is 75% with xAI and 58% without it. Before the homepage checks covered most companies, the share without xAI looked like single digits; with them, AI money is broad (Databricks, Baseten, Harvey and others). Every AI-share chart should still show both views, plus counts and medians.
-
Fund targets cluster on round numbers. $50M is the most common VC fund target, and the median lands on it every year. A third of new funds state "Indefinite". Report quartiles and the share left indefinite. Parallel vehicles often repeat the whole fund's target, so a fund family's target is its largest vehicle's target, not the sum.
-
Emerging-manager counts are biased upward early on. For unnumbered funds the rule counts earlier fund families in the data, and the data starts in 2019.