尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Portfolio management app
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
A personal investment dashboard built with Next.js for tracking stock positions (US and Japanese equities), monitoring real-time P&L, and researching new stocks before buying. All portfolio data lives in your browser's localStorage — nothing is uploaded anywhere.查看完整 README ↗A personal investment dashboard built with Next.js for tracking stock positions (US and Japanese equities), monitoring real-time P&L, and researching new stocks before buying. All portfolio data lives in your browser's localStorage — nothing is uploaded anywhere.
localStorageClone the repository:
git clone https://github.com/Gouliath1/portfolio-tracker.git
cd portfolio-tracker
Install dependencies:
npm install
(Optional) Create an environment file for the screener's data providers and the production market-data cache:
cp .env.example .env.local
See .env.example for details — J-Quants and Twelve Data keys are optional and only needed for screener fundamentals; without them the app falls back to Yahoo Finance.
Start the development server:
npm run dev
Open your browser: navigate to http://localhost:3000
On first load you'll see a demo portfolio and a welcome prompt to import your own data (via the Settings panel → Portfolios), or you can add positions manually with the Add Position modal.
npm run dev - Start development server with Turbopacknpm run dev:clean - Start dev server via scripts/startDev.shnpm run build - Build the application for productionnpm run start - Start the production servernpm run lint - Run ESLint for code qualitynpm test / npm run test:watch / npm run test:coverage / npm run test:ci - Run the Jest test suiteportfolio-tracker/
├── src/
│ ├── app/ # Next.js app directory
│ │ ├── api/ # API routes (prices, pnl, dividends, screener, fx-rates, …)
│ │ ├── screener/ # Stock screener page
│ │ ├── returns/deep-dive/ # Analysis (XIRR) page
│ │ └── page.tsx # Main dashboard page (Overview / Assets / Portfolios)
│ ├── components/ # React components (layout, overview, screener, management, tables, charts)
│ ├── hooks/ # Shared React hooks (base currency, alert polling, ticker names, …)
│ ├── lib/
│ │ ├── core/ # Shared business logic (currency, XIRR/return calculations) — aliased as @portfolio/core
│ │ └── server/ # Server-side services (Yahoo/J-Quants fetchers, market-data cache) — aliased as @portfolio/server
│ ├── types/ # Shared TypeScript models — aliased as @portfolio/types
│ ├── data/ # Demo portfolio data
│ └── utils/ # localStorage-backed position store, caches, hooks helpers
├── data/ # Server-side SQLite caches (market data, screener), gitignored
├── scripts/ # Dev/deploy utilities (fetch-constituents, startDev, gitPush)
├── instrumentation.ts # Server startup hook (no-op — data is client-side)
└── ... # Other config files
Portfolio positions are not stored in a checked-in file — they live in your browser's localStorage, one entry per portfolio ("position set"). To get your real data in:
Since everything is local to the browser, clearing site data / a different browser / a different device won't carry your portfolio over — export before doing so if you need to move it.
See .env.example for the full list. Nothing is required for basic use; these enable extra data sources:
TURSO_DATABASE_URL / TURSO_AUTH_TOKEN - cloud SQLite for the market-data cache in production (Vercel's filesystem is read-only); local dev uses data/marketCache.db automaticallyJQUANTS_API_KEY (or JQUANTS_EMAIL / JQUANTS_PASSWORD) - official JPX fundamentals (P/E, P/B, dividend yield) for Japanese screener stocksTWELVE_DATA_API_KEY - fundamentals for US/JP stocks via Twelve Data (free tier); falls back to Yahoo Finance when unsetYAHOO_COOKIE / YAHOO_CRUMB - manual override if Yahoo's crumb endpoint is rate-limited| What | Provider | Notes |
|---|---|---|
| Hosting / deployment | Vercel | Free tier, auto-deploy on push to main |
| Live URL | tracker.julienguille.com | Custom subdomain |
| Domain registrar | GoDaddy | Manages julienguille.com DNS |
| Server / web hosting | OVH | Hosts other sites on the same domain |
To point tracker.julienguille.com to Vercel, a CNAME record is set in GoDaddy:
| Type | Name | Value |
|---|---|---|
| CNAME | tracker | 9d28ed80412bd346.vercel-dns-017.com. |
Vercel project → Settings → Billing → Spending Limit is set to $0 — Vercel will pause the project rather than charge anything if free-tier limits are ever exceeded.
localStorage — they are never sent to a server for persistence.data/) only caches market data (prices, FX rates, screener fundamentals) — public information, not your holdings.git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)This project is licensed under the MIT License - see the LICENSE file for details.
Price updates not working:
.T suffix)My portfolio disappeared:
localStorage. Clearing browser data, using a different browser, or private/incognito mode will not show previously entered positions. Export your position set beforehand if you need to move or back it up.Screener fundamentals missing or stale:
JQUANTS_API_KEY or TWELVE_DATA_API_KEY set, the app falls back to Yahoo Finance, which can be rate-limited — see .env.example for the manual crumb overrideBuild fails:
npm run build locally first to testFor more help, please open an issue on GitHub.
Built with ❤️ using Next.js, React, and TypeScript.