How the numbers work
Glean looks inside the ETFs you hold, adds up your sector mix, and works out moves toward the mix you choose. This page explains every step, rule and threshold, in plain words first and formulas after.
- Latest holdings per ETF
- Dollar-weighted
- Weights in %, differences in pp
- Whole-dollar moves
On this page
The short version
- You enter the ETFs you hold and the dollars in each, for example IVV $6,000, IYW $3,000 and ARKK $1,000.
- Each covered ETF's selected stored holdings are grouped by sector, using reported market values or provider weights. Your sector mix is those ETF mixes blended by your dollars.
- You set a target mix with sliders, or in plain words that Scythe, the assistant, turns into numbers. The target is always yours: Glean never suggests one.
- Glean finds plans: the closest mix it can reach using only the moves each plan allows. Every plan shows how close it gets and how much money moves.
Percent and pp
- Weights, how much of something sits in a sector, are shown in %: Technology 52.6%.
- Differences between two weights are shown in percentage points, pp: going from 52.6% to 47.6% is −5.0 pp, never “−5%” (which would mean 5% of 52.6%). Distances are in pp too.
- Money is in dollars, and plan amounts are whole dollars.
Behind the scenes every weight is a fraction (0.526 means 52.6%), computed at full precision and rounded only for display, so a column of rounded weights may not add up to exactly 100.0%.
An ETF's sector mix
Each ETF uses one selected stored holdings snapshot. For issuer and SEC files, each holding is put in a sector and counted by its positive market value. TickerInside snapshots provide weights instead of market values; their positive weights are grouped by sector and normalized to 100%.
etf_mix[s] = Σ market value of holdings in sector s
÷ Σ market value of all holdings
(issuer/SEC holdings with a positive market value only)etf_mix[s] = Σ positive reported weights in sector s
÷ Σ positive reported weights in the selected snapshotA holding's sector comes from a maintained reference list for that security, then from the issuer's own sector column. If neither resolves it, the planner uses a company-name reference, then the sector of the same security in another eligible ETF. Remaining gaps areUnclassified. For TickerInside weights, the planner first uses a matching ticker's sector from stored issuer/SEC equity holdings, then a ticker-sector reference, where a U.S. listing wins over a foreign exchange code with the same letters; unknown symbols remain unclassified. Issuers spell sectors differently, so known labels are mapped to standard sectors. Non-equity rows in issuer and SEC files, such as cash, money-market funds, futures or warrants, go to Cash & other.
| Sector | Issuer labels mapped to it |
|---|---|
| Technology | Information Technology, Technology |
| Health Care | Health Care, Healthcare |
| Financials | Financials, Financial |
| Consumer Discretionary | Consumer Discretionary, Consumer Cyclical |
| Consumer Staples | Consumer Staples, Consumer Defensive |
| Communication Services | Communication Services, Communications, Telecommunications |
| Industrials | Industrials |
| Energy | Energy |
| Utilities | Utilities |
| Materials | Materials, Basic Materials |
| Real Estate | Real Estate |
| Cash & other | Every row that isn't a stock, and “Cash and/or Derivatives” |
| Unclassified | Stocks with no sector label from any source |
Your portfolio's mix
Your portfolio's mix is the dollar-weighted blend of your ETFs' mixes: each ETF's sector weights times the dollars in it, over the total. ETFs without holdings data are left out, so the mix describes the part of your money that Glean can see.
your_mix[s] = Σ dollars[etf] × etf_mix[etf][s]
÷ Σ dollars[etf]
(ETFs with holdings data only)Example, with IVV $6,000, IYW $3,000 and ARKK $1,000 (60%, 30% and 10% of the money) and the holdings files of October 15–16, 2026:
Technology = 0.6 × 38.3% (IVV)
+ 0.3 × 90.3% (IYW)
+ 0.1 × 24.9% (ARKK)
= 23.0% + 27.1% + 2.5% = 52.6%Distance to your target
The distance between your mix and your target is half the sum of the absolute differences, sector by sector. It reads as the share of your portfolio sitting in a different sector than you want: 0.0 pp is a perfect match, and 100 pp would mean none of it is where you want it.
distance = ½ × Σ | your_mix[s] − target[s] |
Example: Technology 52.6% with a target of 47.6%, and Health Care 8.4% with a target of 13.4%, give ½ × (5.0 + 5.0) = 5.0 pp. Five cents of every dollar sit in a different sector than you want.
How plans are found
A plan is a new dollar amount for each ETF, using the money already in your ETFs: the total stays the same. There are two plan types, though Glean shows only those that improve the match and make a distinct move.
| Plan | Allowed moves |
|---|---|
| Rearrange what you own | Increase and reduce the ETFs you hold |
| Add new ETFs | The same, plus add new ETFs |
You choose how many new ETFs a plan may add; the default is 2. To plan with more or less money, change the dollar amounts in your holdings. Each plan is built in the same steps:
- Shortlist. Only plain, widely held index and sector ETFs (from SPDR, Vanguard, iShares and similar) whose holdings are at least 80% classified can be suggested. Those you don't hold are scored by how well their sector mix points toward what your portfolio is missing; the top 12 are the candidates.
- Only plain ETFs get more money. An ETF you hold that isn't on that list, such as a thematic or active fund, still counts in your mix and can be kept or reduced, but no plan increases it.
- Closest mix. For a set of ETFs, Glean finds the split of your money whose mix is closest to your target within the plan's rules. “Closest” here means the smallest sum of squared sector differences, which prefers several small misses to one big one. When two splits are equally close, the one with smaller moves wins.
- New ETFs, one at a time. The candidate that helps most is added first, then the next. Each joins only if it brings the plan at least 0.5 pp closer to your target, and no plan goes over your limit.
- No slivers. A new ETF that would end up under 1% of the portfolio is dropped and the plan is worked out again. In plans that may both increase and reduce, an ETF you hold that would end up under 1% is removed rather than kept as a sliver.
- Whole dollars. Amounts are rounded to whole dollars, changes under $1 are skipped, and any rounding leftover goes to the largest move.
Each plan lists its moves as add, increase, reduce or remove (reduce to zero), the distance before and after, and the money moved out of your current holdings. If two plans come out the same, for example because no new ETF helps, only one is shown. ETFs you hold without holdings data are never part of a plan; they stay exactly as they are.
SHORTLIST_SIZE = 12 # candidate new ETFs considered per plan MIN_POSITION = 0.01 # 1% of the portfolio MIN_GAIN = 0.005 # 0.5 pp per newly added ETF max_new_funds = 2 # default limit on new ETFs per plan
Scythe, the assistant
Scythe uses Google's Gemini, or a basic reader when Gemini is unavailable. Gemini only reads what you want changed (“Technology −5 pp”, “Energy to 0%”, “no sector above 20%”); Glean's own code does every calculation. The plans themselves always come from the math above, never from the model, and they always use the money already in your ETFs.
- It starts from your current target, or your current mix if you haven't set one, changes only what you asked for, and spreads any difference over the other sectors in proportion to their size, so the total stays 100%.
- Everyday words are read as rough sizes: “a bit” is about 3 pp, “more” or “less” about 5 pp, “a lot” about 10 pp, and “no energy” means 0%. It always shows the result, so you can adjust it.
- It never suggests what mix you should want, never says a sector is a good or bad idea, and never predicts markets. Asked for advice, it says the choice is yours and offers to explain what a sector contains.
- Gemini receives your message, recent chat turns, current sector mix, target and portfolio total when enabled. Glean does not automatically send your ETF list or account identity to it; text you choose to type in a message is included.
The sliders work without Scythe. If Gemini isn't available, a simple built-in reader still handles plain requests such as “less tech”, “no energy” or “30% health care”.
Gemini also writes two explanations on request. “Why these moves?” describes a plan and “What's inside?” describes a fund. Glean computes the facts first (each move's sectors, the gaps to your target, fees, the biggest holdings) and Gemini only puts them into plain words; moves it names that aren't in the plan are dropped. When Gemini is busy, the same facts fill a fixed template, and each explanation says which one you are reading.
Data sources and freshness
| Source | What it gives | How fresh |
|---|---|---|
| ARK Invest holdings file | Every holding with shares and market value. Sectors come from the reference list. | The latest market day when fetched |
| iShares holdings files | Every holding with market value and the issuer's own sector | The latest market day when fetched |
| SEC N-PORT filings | Holdings that funds report to the SEC, for many more ETFs. No sector field. | Published with a delay; can be a few months old |
| TickerInside holdings | Reported holding weights, without shares or per-holding market values | The date reported by the provider; an added fund can trigger a lookup |
| Alpaca IEX closes | Stored daily prices shown alongside provider holdings; not used to weight sector mixes | Refreshed after market close on weekdays when the scheduled sync is configured |
| Nasdaq symbol directories | The list of U.S.-listed ETFs you can search | No holdings |
Each ETF uses its latest stored issuer/SEC snapshot unless a TickerInside snapshot is the only available source, or is strictly newer and assigns a sector to as much of the fund (or at least 80% of it). ETFs in one portfolio can have different dates, and sources are not mixed inside one fund's selected snapshot. Issuer files describe the previous market day at best; SEC filings can be older. When you add a fund, the app tries a bounded TickerInside lookup if none is stored. ARK's file is read from:
https://assets.ark-funds.com/fund-documents/funds-etf-csv/ARK_INNOVATION_ETF_ARKK_HOLDINGS.csv
Issuer and SEC files are checked before storage, and each snapshot keeps its source address, date and a fingerprint of its contents. The searchable ETF list is much larger than the set with holdings: an ETF without holdings data can be added to your portfolio, but it is flagged and left out of the math.
Saving without an account
There are no accounts. Your ETFs, amounts and target save automatically under a random link, and this browser keeps a private edit key for it. The server stores only a fingerprint of the key, never the key itself.
- Anyone with the link can see the saved portfolio.
- Only a browser holding the edit key can change or delete it.
- Opening someone else's link and making changes saves them as your own copy.
- If you clear this browser's site data, the key goes with it and the portfolio can no longer be changed.
Limitations
- Taxes, transaction costs and bid-ask spreads are not considered. Reducing an ETF can have tax consequences. Yearly fund fees (net expense ratios) are shown, from each fund's SEC filing via TickerInside, with the filing date; they don't change which plan is found.
- Holdings can lag by a day or more (N-PORT by months), and funds change their holdings over time, so your real mix today can differ. Stored IEX closes are daily, not live prices.
- ETFs without holdings data are flagged and kept out of the mix and the plans.
- Sector labels come from issuers and maintained references, not one official classification across all sources. ARK's sectors are assigned by the team; unresolved N-PORT and TickerInside holdings may be Unclassified. IEX closes may differ from consolidated market prices.
- The mix and the plans are by sector only. The Companies view adds up each company across your ETFs and shows how much two funds overlap (the share of each held in the same companies), but plans don't aim at company-level targets, company size or country.
- Plans are in dollars, not shares, and don't check minimums or whole-share rules. They only use ETFs that have holdings data.
Based on dated ETF holdings. Not investment advice.