One of the app's features lets you select ARK Invest 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 that reads the generated ./api/ark static feed (ark-funds.com ETF pages and per-fund overview, NAV-history and performance JSON — official NAV returns, expenses, net assets and whole-life NAV/market-price history — plus the official daily holdings CSV files, with SEC EDGAR N-PORT-P and Yahoo Finance as fallbacks) into a searchable ETF/asset-class catalog with per-fund tabs, watchlist aggregation, ticker copy and CSV/TXT export — the same look, feel, columns and business logic as the sibling applications.
bunx degit daggerok/ARK#main ./12345 && cd $_
bunx serve . -p 1234
open http://0:1234GitHub Pages serves the main branch; the application will be available at https://daggerok.github.io/ARK/ once the implementation branch is merged (deployment pending).
Run the updater with Bun:
bun test
./scripts/update-data.tsRun ./scripts/update-data.ts -h (or --help) to print every configuration variable with its default and usage examples.
Defaults live in scripts/update-data.config.json (every control as a string). Explicit environment variables override the file; an ARK_<KEY> alias (for example ARK_CONCURRENCY) wins over the plain <KEY> when both are set. The Update ARK Invest ETF data GitHub Actions workflow uses the same resolver: individual workflow_dispatch inputs are blank by default and inherit the file, the advanced input accepts a JSON object with any control, and the precedence is file < advanced JSON < nonblank individual inputs. GitHub allows at most 25 inputs, so SEC_UA, SKIP_ARK and VERBOSE are set through advanced (for example {"VERBOSE":"true"}). All supplied filters use AND logic.
| Block | Source |
|---|---|
| Catalog (the 14 ARK ETFs) | https://www.ark-funds.com/our-etfs/ (the official ETF overview page; ARKVX, an interval fund, is excluded) |
| Fund facts per fund | https://www.ark-funds.com/api/fund/overview/{ID} (the JSON behind each fund page, e.g. ARKK; the page ID is discovered from the page at run time) |
| Holdings per fund | https://assets.ark-funds.com/fund-documents/funds-etf-csv/{FUND}_HOLDINGS.csv (the official daily holdings CSV linked from each fund page; ARKY uses a structured-note layout) |
| Daily history | https://www.ark-funds.com/api/fund/nav-historical-change/{ID} (official NAV and market-price history) |
| Returns | https://www.ark-funds.com/api/fund/performance/{ID} (official month-end and quarter-end NAV returns) |
| Distributions | Yahoo Finance chart API dividend events (ARK publishes no dividend-history endpoint) |
| Fallback | SEC EDGAR N-PORT-P (ARK ETF Trust, CIK 0001579982; Ark 21Shares Bitcoin ETF, CIK 0001869699) + Yahoo Finance chart API as fallbacks |
All issuer requests go directly to ark-funds.com with a short contact-bearing User-Agent (DaggerOk ARK static feed updater (admin@…)). The site's Cloudflare WAF answers HTTP 403 to any User-Agent that contains a URL (the crawler-style (+https://github.com/…)) and challenges browser User-Agents sent from a non-browser TLS stack, so the updater deliberately uses neither. Only if two consecutive direct requests are still denied does it fall back to the read-only r.jina.ai reader for the remaining issuer requests (one [ issuer ] notice; that reader is limited to roughly 20 requests per minute, so proxied requests are spaced 3 seconds apart across the whole run). A previously published fund page ID is reused when the overview endpoint confirms it still answers for the same ticker, which skips the heaviest page download on repeat runs; IDs are never hard-coded. Holdings CSVs, SEC EDGAR and Yahoo Finance are always fetched directly. A fund whose sources fail keeps its previously published data.
Each fund carries a derived metrics object that powers the catalog columns shared with the sibling sites:
ytd/tr1y— official YTD and 1-year NAV 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— indicated yield (latest Yahoo Finance distribution × inferred frequency ÷ market price) or trailing 12-month yield;—when no distributions are reportedsecYield— 30-day SEC yield when published on the fund page;—otherwise
| Environment variable | Default | Meaning |
|---|---|---|
MAX_FETCHES |
all | Batch size: with a positive value the updater continues after the committed cursor in api/ark/update-state.json; empty or 0 is a full pass — every fund is refreshed in one run. |
REQUEST_SLEEP |
1.5 |
Minimum delay in seconds between request starts within one worker, including retries, for every provider (ark-funds.com, Azure holdings, Yahoo Finance, SEC EDGAR). Only the last-resort r.jina.ai fallback is additionally limited to one request every 3 seconds across all workers. |
CONCURRENCY |
2 |
Number of independent fund workers. Each worker owns its request lane, so CONCURRENCY=15 starts 15 funds at once and total run time shrinks roughly in proportion. |
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. |
CATEGORY |
all | Case-insensitive substring of the fund category, e.g. Thematic. |
TICKERS |
all | Space-, comma- or semicolon-separated ticker allowlist, e.g. ARKK ARKW ARKG ARKB. |
PERFORMANCE_YTD / _1Y / _3Y / _5Y / _10Y |
: |
Official annualized NAV return ranges in %. |
TOTAL_RETURN_YTD / _1Y / _3Y / _5Y / _10Y |
: |
Cumulative NAV total-return ranges in %. |
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. Only network errors (including the 90-second per-request timeout) and HTTP 408/425/429/5xx are retried with exponential backoff and Retry-After. |
SEC_UA |
declared UA | Override the SEC User-Agent. SEC policy requires automated tools to declare a contact. |
EDGAR_FALLBACK |
on | Set to 0/false to disable the SEC EDGAR N-PORT-P holdings fallback. |
SKIP_ARK |
off | Do not request ark-funds.com; keep the fixed catalog and previously published official data and only run the fallbacks. |
SKIP_YAHOO |
off | Skip Yahoo Finance history and distribution updates. |
VERBOSE |
off | Print per-request retry and fallback notices. |
TICKERS combines with AUM, TER, yield and return filters using AND logic; it does not override them. Funds not selected for a successful update keep their prior published metadata and data files.
MAX_FETCHES=3 ./scripts/update-data.ts
CONCURRENCY=15 ./scripts/update-data.ts
TICKERS="ARKK ARKW ARKG ARKB" ./scripts/update-data.ts
AUM="1B:" TER=":0.75" ./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, and git diff --check.
| Brand | Where to get the data |
|---|---|
| abrdn (Aberdeen) | aberdeeninvestments.com | aberdeen |
| Amplify | amplifyetfs.com | Amplify |
| ARK Invest | ark-funds.com | ARK |
| Capital Group | capitalgroup.com | Capital-Group |
| Fidelity | fidelity.com | Fidelity |
| First Trust | ftportfolios.com | First-Trust |
| Franklin Templeton | franklintempleton.com | Franklin |
| Global X | globalxetfs.com/explore | Global X |
| Goldman Sachs | am.gs.com | Goldman-Sachs |
| Invesco | invesco.com | Invesco |
| iShares | ishares.com | iShares |
| JPMorgan | am.jpmorgan.com | JPMorgan |
| NEOS | neosfunds.com | Neos |
| Northern Trust | etfs.ntam.northerntrust.com | Northern-Trust |
| ProShares | proshares.com | ProShares |
| Schwab | schwabassetmanagement.com | Schwab |
| SPDR | ssga.com | SPDR |
| VanEck | vaneck.com | VanEck |
| Vanguard | investor.vanguard.com | Vanguard |
| VictoryShares | vcm.com VictoryShares ETFs | VictoryShares |
| WisdomTree | wisdomtree.com | WisdomTree |
| Application | Data provider | Repository |
|---|---|---|
| abrdn (Aberdeen) | Official Aberdeen gateway + SEC N-PORT holdings fallback + Yahoo history/dividends | aberdeen |
| Amplify | Amplify ETFs (Firestore data feed) | 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 CSV downloads + Yahoo Finance | 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 |
| ProShares | proshares.com ETF finder + fund pages + official data host | ProShares |
| Schwab | schwabassetmanagement.com product pages + CSV exports | Schwab |
| SPDR | SSGA / State Street public feeds | SPDR |
| 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 |
MIT — same as all sibling ETF repositories.
ARK®, ARK Invest® and the fund names/tickers referenced here are trademarks of ARK Investment Management LLC. This is an independent, unofficial tool; it is not affiliated with, endorsed by, or sponsored by ARK Investment Management LLC or ARK ETF Trust. All data is reproduced from ARK Invest's own public fund pages and downloads, public SEC EDGAR filings and Yahoo Finance for research purposes. All other trademarks, including index names, are the property of their respective owners.