Methods

How these numbers are made.

The tally is self-reported and unverified. It is not an official vote, not a proxy, and not a sample of all holders.

Share ledger

A holder posts a stance (For, Against, or Undecided), a broker, and a whole-number share change. The change can be negative. +60 at Schwab and later +50 at Webull are two rows. −20 at Schwab reduces the Schwab row for that stance. The counted net for one browser, one broker, and one stance cannot go below zero.

An identical repeat is rejected: the same salted address hash, the same browser token, the same broker, and the same signed share change. A different broker, or a different number, is a new row. The stance is not part of that duplicate check, so the same number cannot be posted twice at one broker just by switching stance.

The raw network address is not stored. The server hashes it with a secret salt. The browser token is an HttpOnly cookie. More than 8 submissions an hour, or 30 in a day, from the same hash are refused. An absolute change above 100,000 shares is stored as held and left out of the public totals until a review token accepts it. Changes above one billion shares are rejected.

Holder count is the number of distinct hash-and-token pairs whose counted shares, across brokers and stances, are above zero. The retail line is For divided by For plus Against, only when that denominator is above zero. Undecided shares are shown in the totals and are not in the percent. Days with no new counted rows are not backfilled, except that the latest cumulative total is carried to today and marked as carried forward.

Cloudflare Turnstile has to succeed before a row is stored. On a public host the test secret is rejected. If the salt or the Turnstile secret is missing, the API returns an error and the page does not pretend the total is zero.

Compared with 13F filings

A counted retail entry can be shown as a percent of one Form 13F filer. scripts/broker_13f.py reads public/data/holders.json and writes public/data/broker-13f.json. Schwab uses Charles Schwab Investment Management, the only Schwab-named manager. Fidelity uses FMR LLC, because no manager name says Fidelity. Vanguard uses the Vanguard-named filer with the most reported shares and does not add the other Vanguard filers. E*TRADE/Morgan Stanley uses the exact name Morgan Stanley. Merrill uses Bank of America Corp /DE/, because no manager is named Merrill Lynch. Robinhood, Webull, SoFi, Public, Interactive Brokers, and Other have no matching filer, and the page says so. The percent is self-reported shares divided by that filer’s reported shares for the primary report period. It is not the filer’s vote and not a percent of shares outstanding.

Prediction markets

The market line is the YES price for one Polymarket contract: “Tesla and SpaceX merger officially announced by December 31?” (market 2252540). Each point is the last price the CLOB history returned for that UTC day. Other deadlines on the same event are fetched as their own series. The sentiment page can draw one when its price history came back. They are not averaged into the December 31 line. Manifold history comes from filled bets when that API returns them. Polymarket page · price history

Kalshi, at the last check (2026-10-25T00:54:09.279114+00:00): no matching open market in the pages requested.. The chart says “No market yet” for a venue with no returned price. It does not draw a stand-in.

Headlines

The media series uses the GDELT DOC 2.0 API. Query: Tesla SpaceX merger. Timespan: three months. GDELT did not return points, so titles from the Google News RSS search were scored with the same word lists. 8 days are stored. Days without a returned value are not drawn as zero.

GDELT tone: display = clamp(50 + tone * 5, 0, 100). Title lexicon, including Google News RSS titles: tone is (positive hits - negative hits) / title words, and display = clamp(50 + tone * 50, 0, 100).

Positive words: approve, approved, approves, support, supports, supported, back, backs, backed, win, wins, agree, agrees, synergy, synergies, optimistic, rally, rallies, surge, surges. Negative words: against, oppose, opposes, opposed, reject, rejects, rejected, block, blocks, blocked, dilution, dilutive, conflict, conflicts, sue, sues, lawsuit, fail, fails, failed, worry, worries, risk, risks, crash, plunge, plunges. A title that contains neither scores as neutral when the lexicon method is the one in use.

File generated 2026-10-25T00:54:09.279114+00:00. scripts/fetch_sentiment.py rewrites it. A daily Action opens a pull request when the file changes.

Institutional votes

scripts/fetch_npx.py searches EDGAR full text for CUSIP 88160R101 on Form N-PX, keeps filings whose names match BlackRock/iShares, Vanguard, State Street/SPDR, Fidelity, Geode, or Capital Group/American Funds, and reads the XML vote table for the periods ended June 30, 2024 and June 30, 2026. A cell is filled only from parsed rows. Norges Bank does not file N-PX. The 2016 and 2018 meetings are not parsed from older text filings unless a later run actually reads them.