尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Stock Analysis for QQQQ
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗A web dashboard for every component of QQQQ with current weights, live prices, and a month-by-month allocation history — plus a recurring cron job that keeps the data fresh.
What is "QQQQ"?
QQQQis the legacy ticker for the Invesco QQQ Trust (renamed toQQQin 2011), the ETF that tracks the Nasdaq-100 Index. Its "components" are the ~100 Nasdaq-100 constituents — that's what this tracker shows.
aria-sort / aria-expanded state; press / to jump to the
filter box. A skip link, a screen-reader status region, labelled charts, and
a prefers-reduced-motion pass round out the accessibility support.npm test); the only dev dependency
is ESLint (npm run lint).index.html / styles.css / app.js The dashboard interface
server.js Zero-dep static server (+ /api/refresh, /api/quotes)
lib/holdings.js Pure, tested data-pipeline helpers
lib/quotes.js Shared live-quote fetching (FMP or Yahoo)
api/quotes.js Vercel serverless function for /api/quotes
scripts/fetch-holdings.js Fetches holdings + prices, writes data/*.json
test/*.test.js Unit tests (data pipeline, quotes, server)
e2e/smoke.test.js Browser smoke test of the dashboard
data/holdings.json Current holdings snapshot
data/monthly-allocations.json Per-ticker monthly allocation history
data/changes.json Log of constituent additions/removals
data/price-history.json Daily QQQ closing prices (fund performance)
vercel.json Vercel deploy config (static + function)
.github/workflows/ci.yml Lints and runs the test suite on every PR
.github/workflows/refresh.yml The recurring data-refresh cron job
.github/workflows/pages.yml Deploys the dashboard to GitHub Pages
ROADMAP.md Planned features and project direction
See ROADMAP.md for where the project is headed.
Requires Node.js 20+. The app itself has no runtime dependencies; run
npm install once to get the dev tooling (ESLint, Playwright, Vercel CLI)
for lint / test / test:e2e.
npm install # install dev tooling — one time
npm start # serve the dashboard at http://localhost:3000
npm run refresh # refresh data/*.json once, right now
REFRESH_MINUTES=30 npm start # serve + auto-refresh data every 30 min
npm run lint # lint the JavaScript sources
npm test # run the unit tests
npm run test:e2e # browser smoke test (needs `npx playwright install chromium`)
Data is refreshed by .github/workflows/refresh.yml, a scheduled GitHub
Actions workflow. It runs scripts/fetch-holdings.js, which:
FMP_API_KEY is set, then the latest SEC N-PORT filing,
then the last good data. Weights are never invented from market cap.data/holdings.json, appends the current month's weights to
data/monthly-allocations.json, and logs any constituent changes to
data/changes.json.Schedule: every 30 minutes during US market hours, plus a post-close snapshot. Trigger it manually any time from the Actions tab ("Run workflow").
GitHub only runs scheduled workflows from the repository default branch.
That default is currently claude/qqqq-component-tracker-O4OBc, not main,
so cron refreshes (and their data commits) land there. Switching the default
to main is a repo-settings change this codebase cannot make; until then,
keep refresh fixes on the default branch so the cron actually sees them.
If a data source is temporarily unreachable, the script falls back to the last good data so the job stays green and the site keeps working. When that happens the workflow opens (and later auto-closes) a GitHub issue, so a silently stale dashboard gets noticed.
FMP_API_KEY secretInvesco's download endpoint and Yahoo Finance both block automated requests, so the free path can be unreliable. For dependable data, get a free API key from Financial Modeling Prep and add it to the repo:
Settings → Secrets and variables → Actions → New repository secret
— name FMP_API_KEY, value = your key.
refresh.yml already passes it through; locally, run
FMP_API_KEY=yourkey npm run refresh or put FMP_API_KEY=yourkey in a
.env file (gitignored — the npm scripts load it automatically).
npm start), the page also calls GET /api/quotes every
20s; the server fetches fresh quotes (15s cache) so prices update between
cron runs. On static hosting this call simply no-ops.The dashboard is fully static. .github/workflows/pages.yml publishes it
to GitHub Pages on every push to main (including the cron's data commits).
One-time setup: Settings → Pages → Source = "GitHub Actions".
vercel.json deploys the same static dashboard to Vercel, plus a
serverless function (api/quotes.js) that backs GET /api/quotes — so
live price polling works on Vercel (unlike GitHub Pages, where it no-ops).
One-time setup: import the repo at vercel.com/new.
For reliable prices, add an FMP_API_KEY environment variable in the Vercel
project settings — without it the function falls back to Yahoo Finance.
The Vercel CLI is included as a dev dependency: run npx vercel dev to
preview the dashboard and the /api/quotes function together locally, or
npx vercel deploy to deploy from the command line. The CLI bundles many
transitive packages, so npm audit reports advisories from them — all
dev-only and never shipped to the app; see SECURITY.md.
FMP_API_KEY is set, or the
latest SEC N-PORT filing. Last-good / seed is used only when every live
source fails.data/*.json ships with a sample dataset (source: "seed")
so the dashboard works immediately; the first successful cron run replaces it
with live data.For informational purposes only — not investment advice.