{"id":48757364,"url":"https://github.com/maur1th/portfolio-tracker","last_synced_at":"2026-04-13T03:50:48.792Z","repository":{"id":343698942,"uuid":"1178796267","full_name":"maur1th/portfolio-tracker","owner":"maur1th","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-06T20:40:58.000Z","size":321,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-06T22:21:51.540Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maur1th.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-11T11:29:36.000Z","updated_at":"2026-04-06T20:41:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/maur1th/portfolio-tracker","commit_stats":null,"previous_names":["maur1th/portfolio-tracker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/maur1th/portfolio-tracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maur1th%2Fportfolio-tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maur1th%2Fportfolio-tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maur1th%2Fportfolio-tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maur1th%2Fportfolio-tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maur1th","download_url":"https://codeload.github.com/maur1th/portfolio-tracker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maur1th%2Fportfolio-tracker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31739050,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T03:27:07.512Z","status":"ssl_error","status_checked_at":"2026-04-13T03:26:53.610Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-13T03:50:48.202Z","updated_at":"2026-04-13T03:50:48.784Z","avatar_url":"https://github.com/maur1th.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Portfolio Tracker\n\nInvestment portfolio tracker. Monitors positions across multiple brokers and accounts. Positions are imported manually via CSV exports, and valuations are fetched from Yahoo Finance.\n\nBuilt with Next.js, SQLite (via Drizzle ORM), and shadcn/ui.\n\n## Features\n\n- Import positions from Boursobank (CSV) and IBKR (transaction history CSV)\n- Live valuations via Yahoo Finance\n- Multi-currency support with EUR conversion\n- Geographic exposure breakdown using ETF country weights\n- Portfolio charts and analytics\n\n## Prerequisites\n\n- [Node.js](https://nodejs.org/) 24+ (LTS)\n- [pnpm](https://pnpm.io/) 10+\n\n## Getting Started\n\n```bash\n# Install dependencies\npnpm install\n\n# Initialize the database\npnpm db:push\n\n# Seed brokers and accounts\npnpm db:seed\n\n# Start the dev server\npnpm dev\n```\n\nThe app will be available at [http://localhost:3000](http://localhost:3000).\n\n## Usage\n\n1. Navigate to the import page in the UI\n2. Select a broker and account\n3. Upload a CSV export from your broker\n4. The dashboard will display your positions with live valuations\n\n### Supported Brokers\n\n- **Boursobank** — CSV import replaces all positions for the target account\n- **IBKR** — Transaction history import; positions are computed from stored transactions using weighted-average cost\n\n### CSV Formats\n\n- **Boursobank**: Semicolon-separated, French number format. Columns: Code ISIN, Designation, Quantite, PRU\n- **IBKR**: Standard CSV. Columns: Symbol, Description, Quantity, Cost Price, Currency\n\n## Project Structure\n\n```\nsrc/\n  app/          Next.js App Router pages and API routes\n  components/   React components (shadcn/ui in ui/)\n  db/           Drizzle schema, connection, seed\n  lib/          Business logic (yahoo-finance, portfolio, currencies, csv-parsers)\n  types/        Shared TypeScript types\ndata/           SQLite database (gitignored)\ndrizzle/        Generated migrations\n```\n\n## Database Commands\n\n| Command | Description |\n|---|---|\n| `pnpm db:push` | Push schema to SQLite |\n| `pnpm db:seed` | Seed brokers and accounts |\n| `pnpm db:studio` | Open Drizzle Studio |\n\n## License\n\n[Apache 2.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaur1th%2Fportfolio-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaur1th%2Fportfolio-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaur1th%2Fportfolio-tracker/lists"}