尚未偵測到更新。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.