One of the app's features lets you select WisdomTree ETFs in the Watchlist and aggregate their holdings to see how often each ticker appears across the selected funds. Repeated holdings make overlapping exposure visible: the more selected funds include a ticker, the greater its potential influence on the portfolio; gains in that holding may help, while declines may hurt, and actual impact also depends on each fund's position size. Another feature makes it faster and easier to find funds with stronger growth over different periods, higher dividend yields or distributions, greater Total Return (price performance plus dividends), and other key performance metrics. A single-file client-side tool reading the generated ./api/wisdomtree static feed (WisdomTree product pages - including official Market Price/NAV/Underlying Index returns and the official tax-character distributions table, SEC EDGAR N-PORT-P holdings, Yahoo Finance history with a narrow distributions/returns fallback) into a searchable ETF/asset-class catalog with per-fund tabs, watchlist, N-PORT upload, CSV/TXT export - the same look, feel, columns and business logic as the sibling applications.
bunx degit daggerok/WisdomTree#main ./12345 && cd $_
bunx serve . -p 1234
open http://0:1234The published application is available at https://daggerok.github.io/WisdomTree/.
Run the updater with Bun:
bun scripts/update-data.tsRun bun scripts/update-data.ts -h (or --help) to print every control with its default and usage examples.
Defaults live in scripts/update-data.config.json. Precedence: file defaults < advanced JSON < nonblank workflow inputs < protected Actions variable or environment variable. A blank input inherits the file value, and the CLI and the Update WisdomTree ETF data workflow share one resolver (resolveControls in scripts/update-data.ts). The workflow exposes 24 controls as individual inputs; every other control (HOLDINGS_PAGE_SIZE, STORE_RAW_DOWNLOADS, SEC_UA, VERBOSE, USE_SYSTEM_CA) is reachable through the advanced JSON input, for example {"STORE_RAW_DOWNLOADS":"true"}. An explicitly set environment variable always wins, even when empty. The protected SEC_UA repository Actions variable overrides the SEC contact when nonblank. Output is always written to api/wisdomtree. All supplied filters use AND logic.
| Block | Source |
|---|---|
| Catalog (all US WisdomTree ETFs) | https://www.wisdomtree.com/investments (WisdomTree product table) |
| Holdings per fund | SEC EDGAR N-PORT-P primary_doc.xml (WisdomTree Trust CIK 0001350487) |
| Per-fund returns, distributions | WisdomTree product page's "Total Returns" table (Market Price/NAV/Underlying Index rows) and "Recent Distributions" table (ex/record/payable date + Ordinary Income/ST/LT Cap Gains/Return of Capital) - the primary source for both |
| Daily history; returns/distributions fallback | Yahoo Finance chart API for daily history unconditionally, and as fallback for Market Price Returns tenors and distribution ex-dates the official page doesn't cover |
| Fallback | WisdomTree product pages for NAV, expense ratio, yields |
Each fund carries a derived metrics object that powers the catalog columns shared with the sibling sites:
ytd/tr1y- official YTD and 1-year returns -> YTD Return, TR 1Ycagr3y/cagr5y/cagr10y- published annualized 3Y/5Y/10Y figures -> CAGR 3Y/5Y/10Ytr3y/tr5y/tr10y- cumulative 3Y/5Y/10Y figures(1 + CAGR)^n - 1-> TR 3Y/5Y/10YsiAnn- since-inception annualized -> SI Ann.dividendYield- 12-month trailing yield or indicated yield (latest distribution x frequency / price)secYield- 30-day SEC yield when published; unavailable values stay empty and are never shown as 0returnsBasis- mandatory non-empty text saying how the returns were computed: official WisdomTree month-end Market Price Returns (gaps filled with Yahoo estimates), or estimates derived from Yahoo adjusted closes when the product page is unavailableperformanceAsOf- mandatory ISOYYYY-MM-DDdate the returns are as of: the WisdomTree month-end performance table date, or the last Yahoo close date when derived (not the NAV date);nullonly when truly unknown- NAV and the catalog figures come from WisdomTree; history and returns derived from Yahoo adjusted closes are market-price estimates, not official NAV returns
- A limited
HISTORY_RANGEshortens the published history, so long-tenor figures derived from Yahoo are unavailable for ranges shorter than the tenor
Every control is a key in scripts/update-data.config.json; values are strings.
| Control | Default | Meaning |
|---|---|---|
MAX_FETCHES |
0 |
Batch size: with a positive value the updater continues after the committed cursor in api/wisdomtree/update-state.json; 0 is a full pass over every fund. |
REQUEST_SLEEP |
2 |
Minimum delay in seconds between outgoing request starts, including retries. |
CONCURRENCY |
2 |
Number of parallel fund update workers, each with its own request pacing lane. |
AUM |
: |
Net Assets range. Each bound may be a USD amount or K/M/B/T, or one of nano, micro, small, mid, large. |
TER |
: |
Expense ratio range in % (strict min:max). |
DIVIDEND_YIELD |
: |
Dividend-yield percentage range. |
SEC_YIELD |
: |
30-day SEC yield percentage range (strict min:max), read from the product page; funds without a published SEC yield do not match. |
TICKERS |
empty (all) | Space-, comma- or semicolon-separated ticker allowlist, e.g. DGRW USFR WCLD. |
HOLDINGS_PAGE_SIZE |
250 |
Rows in each generated current-holdings JSON page. |
HISTORY_PAGE_SIZE |
1000 |
Rows in each generated daily-history JSON page. |
MAX_RETRIES |
2 |
Retries after the initial request (integer, at least 1). Network errors and HTTP 403/408/425/429/5xx are retried with exponential backoff. |
HISTORY_RANGE |
max |
Yahoo history window: max requests everything, otherwise one of ytd, 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y. |
STORE_RAW_DOWNLOADS |
false |
Store the rendered official catalog under api/wisdomtree/raw. |
EDGAR_FALLBACK |
true |
Use SEC EDGAR Form N-PORT-P for full holdings. |
SKIP_YAHOO |
false |
Keep previous history and distributions while refreshing catalog and holdings. |
SKIP_WISDOMTREE |
false |
Keep the previously published official catalog. |
SEC_UA |
daggerok ETF feed daggerok@gmail.com |
User-Agent for SEC and WisdomTree requests. SEC policy asks automated tools to declare a contact; the protected SEC_UA Actions variable overrides the default. Redacted in logs. |
VERBOSE |
false |
Print per-fund retry and fallback notices. |
USE_SYSTEM_CA |
auto |
TLS trust store: auto restarts the updater once with Bun's --use-system-ca when a request fails with an untrusted-certificate error; true always uses the system CA store; false never restarts. Not an individual workflow input: use advanced, the config file or the CLI environment. |
PERFORMANCE_YTD / _1Y / _3Y / _5Y / _10Y |
: |
Annualized adjusted-close return range per tenor: min:max. |
TOTAL_RETURN_YTD / _1Y / _3Y / _5Y / _10Y |
: |
Cumulative adjusted-close return range per tenor: min:max. |
TICKERS combines with the AUM, TER, yield and return filters using AND logic; it does not override them. Filtered or bounded runs (TICKERS, MAX_FETCHES, filters, SKIP_WISDOMTREE) and runs where the live catalog could not be read never shrink the feed: funds that were not refreshed keep their published row and files, and index.json always lists every known fund (the published index plus every funds/*/meta.json).
MAX_FETCHES=10 ./scripts/update-data.ts
TICKERS="DGRW USFR WCLD" ./scripts/update-data.ts
AUM="1B:" TER=":0.5" ./scripts/update-data.ts
HISTORY_RANGE=5y SEC_YIELD="3:" ./scripts/update-data.ts
PERFORMANCE_1Y="15:" ./scripts/update-data.tsThe browser app is intentionally build-free: index.html carries the markup, styles and bootstrap, and app.tsx is TypeScript compiled in the browser with Babel standalone - no build step, no bundler, no tsconfig.json needed. Bun runs TypeScript out of the box.
Verification before every publish:
bun install --frozen-lockfile
bun test
bun build --target=bun scripts/update-data.ts --outfile=/dev/null
git diff --checkbun test (scripts/update-data.test.ts) also covers the config file, --help, README controls table and workflow shape.
| Application | Data provider | Repository |
|---|---|---|
| AAM | Official AAM catalog/detail HTML + full holdings XLS + SEC N-PORT holdings fallback + Yahoo market history/dividends | AAM |
| abrdn (Aberdeen) | Official Aberdeen gateway + SEC N-PORT holdings fallback + Yahoo history/dividends | aberdeen |
| Amplify | Amplify ETFs Firestore data feed + SEC EDGAR N-PORT-P holdings fallback + Yahoo Finance history/dividends | Amplify |
| ARK Invest | ark-funds.com fund pages + overview/NAV-history/performance JSON + official daily holdings CSV + SEC EDGAR N-PORT-P holdings fallback + Yahoo Finance distributions/history fallback | ARK |
| Capital Group | Official Capital Group fund data + SEC N-PORT holdings fallback + Yahoo history fallback | Capital-Group |
| Fidelity | SEC EDGAR N-PORT-P + Yahoo Finance | Fidelity |
| First Trust | ftportfolios.com official ETF list + fund summary, holdings, distribution and price-history export pages + SEC EDGAR N-PORT-P holdings fallback + Yahoo Finance history fallback | First-Trust |
| Franklin Templeton | franklintempleton.com ETF listings + product pages + SEC EDGAR N-PORT-P | Franklin |
| Global X | globalxetfs.com Next.js catalog and fund pages + dated full-holdings CSV | Global-X |
| Goldman Sachs | am.gs.com fund finder + detail pages + SEC EDGAR N-PORT-P | Goldman-Sachs |
| Invesco | invesco.com fund pages and sitemap + official Invesco fund API (monthly returns, NAV, AUM, yields, daily holdings, expense ratio) + SEC EDGAR N-PORT-P holdings fallback + Yahoo Finance history/dividends | Invesco |
| iShares | iShares (BlackRock) product workbooks | iShares |
| JPMorgan | am.jpmorgan.com fund explorer + product-data JSON | JPMorgan |
| NEOS | neosfunds.com lineup table + official fund pages + daily holdings CSV | Neos |
| Northern Trust | etfs.ntam.northerntrust.com funds list + per-fund CSV/JSON downloads | Northern-Trust |
| Pacer ETFs | paceretfs.com product catalog and fund pages (Cloudflare WAF; r.jina.ai proxy fallback) + SEC EDGAR N-PORT-P (Pacer Funds Trust) + Yahoo Finance history/dividends | Pacer |
| Parametric | eatonvance.com ETF catalog and Parametric product pages + SEC EDGAR N-PORT-P holdings + Yahoo Finance history/dividends | Parametric |
| ProShares | proshares.com ETF finder + fund pages + official data host | ProShares |
| Schwab | schwabassetmanagement.com product pages + CSV exports | Schwab |
| SP Funds | sp-funds.com homepage catalog, fund pages and daily holdings CSV + SEC EDGAR N-PORT-P holdings fallback + Yahoo Finance history/dividends | SP-Funds |
| SPDR | SSGA / State Street public feeds | SPDR |
| Sprott ETFs | sprottetfs.com fund pages + SEC EDGAR N-PORT-P (Sprott Funds Trust) + Yahoo Finance history/dividends | Sprott |
| Tema ETFs | Tema official fund pages + dated daily holdings CSV; SEC EDGAR N-PORT-P holdings fallback only + Yahoo Finance price/history/dividend fallback | Tema |
| Themes ETFs | themesetfs.com catalog + daily holdings CSV + Yahoo Finance history/dividends + SEC N-PORT-P holdings fallback | Themes |
| VanEck | vaneck.com ETF finder + product pages | VanEck |
| Vanguard | Vanguard product pages + SEC EDGAR N-PORT-P | Vanguard |
| VictoryShares | VCM VictoryShares catalog and product JSON + SEC EDGAR N-PORT-P holdings fallback + Yahoo Finance adjusted-market-price history | VictoryShares |
| WisdomTree | WisdomTree product table + SEC EDGAR N-PORT-P + Yahoo Finance | WisdomTree |
| Xtrackers | Official DWS catalog/US sitemap + PDP/XLSX + SEC N-PORT-P holdings fallback + Yahoo Finance daily prices/history/dividends | Xtrackers |
MIT - same as all sibling ETF repositories.
WisdomTree® and the fund names/tickers referenced here are trademarks of WisdomTree, Inc. This is an independent, unofficial tool; it is not affiliated with, endorsed by, or sponsored by WisdomTree. All data is reproduced from WisdomTree's own public product pages, public SEC EDGAR filings and Yahoo Finance for research purposes. All other trademarks, including index names, are the property of their respective owners.