{"id":50265386,"url":"https://github.com/akin-mustapha/portfolio-management-platform","last_synced_at":"2026-05-27T13:39:05.045Z","repository":{"id":339848770,"uuid":"1131340180","full_name":"akin-mustapha/portfolio-management-platform","owner":"akin-mustapha","description":"Portfolio data ingestion pipeline","archived":false,"fork":false,"pushed_at":"2026-05-16T21:22:51.000Z","size":6369,"stargazers_count":1,"open_issues_count":13,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-27T13:38:57.061Z","etag":null,"topics":["alembic-migration","api","dash","dash-ui","dashboard","data","data-engineering","docker-compose","ingestion-pipeline","kafka","postgres","prefect","stock-market","system-design"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/akin-mustapha.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-01-09T21:04:18.000Z","updated_at":"2026-05-08T22:01:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/akin-mustapha/portfolio-management-platform","commit_stats":null,"previous_names":["akin-mustapha/portfolio-management-platform"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/akin-mustapha/portfolio-management-platform","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akin-mustapha%2Fportfolio-management-platform","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akin-mustapha%2Fportfolio-management-platform/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akin-mustapha%2Fportfolio-management-platform/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akin-mustapha%2Fportfolio-management-platform/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/akin-mustapha","download_url":"https://codeload.github.com/akin-mustapha/portfolio-management-platform/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akin-mustapha%2Fportfolio-management-platform/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33568857,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-27T02:00:06.184Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["alembic-migration","api","dash","dash-ui","dashboard","data","data-engineering","docker-compose","ingestion-pipeline","kafka","postgres","prefect","stock-market","system-design"],"created_at":"2026-05-27T13:39:04.062Z","updated_at":"2026-05-27T13:39:05.037Z","avatar_url":"https://github.com/akin-mustapha.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Portfolio Management Platform\n\nA personal stock portfolio monitoring platform. Pulls data from [Trading212](https://www.trading212.com/), processes it through a medallion ETL pipeline, and surfaces it on a React dashboard with analytics Trading212 doesn't provide natively.\n\n---\n\n## What It Does\n\n- Ingests live and historical portfolio data from the Trading212 API\n- Processes data through bronze → silver → gold layers (raw → staging → analytics)\n- Serves a React dashboard with portfolio and asset-level metrics:\n  - Total value, cost basis, and return (absolute and %)\n  - Per-asset drawdown, volatility, moving averages, and DCA signals\n  - Portfolio distribution and risk metrics\n\n---\n\n## Architecture\n\n```txt\nFrontend        vault/frontend/               React (Vite + MUI) — :5173\nAPI             vault/backend/                FastAPI — :8001\nOrchestration   vault/pipeline/orchestration/ Prefect — :4200\nPipeline        vault/pipeline/etl/           ETL (bronze → silver → gold)\nStorage         raw → staging → analytics     Postgres (3 schemas)\n```\n\n| Schema      | Layer  | Description                                        |\n|-------------|--------|----------------------------------------------------|\n| `raw`       | Bronze | Append-only, partitioned by date, data as received |\n| `staging`   | Silver | Typed, deduplicated, normalised                    |\n| `analytics` | Gold   | Kimball star schema — built for dashboard queries  |\n\n---\n\n## Tech Stack\n\n| Concern        | Tool                          |\n|----------------|-------------------------------|\n| Frontend       | React, Vite, MUI, Recharts    |\n| API            | FastAPI, Uvicorn              |\n| Orchestration  | Prefect                       |\n| Validation     | Pydantic                      |\n| Database       | PostgreSQL, SQLModel, Alembic |\n| Testing        | Pytest                        |\n| Runtime        | Python 3.13 / Node 20         |\n\n---\n\n## Prerequisites\n\n- Python 3.13+\n- Node 20+\n- Docker (for Postgres)\n- A [Trading212](https://www.trading212.com/) account with API access\n\n---\n\n## Setup\n\n```sh\ngit clone \u003crepo-url\u003e\ncd portfolio-management-platform/vault\npython3 -m venv venv \u0026\u0026 source venv/bin/activate\npip install -e \".[dev]\"\ncp .env.example .env   # fill in credentials\ndocker compose up -d\nalembic -c migrations/postgres/alembic_raw.ini upgrade head\nalembic -c migrations/postgres/alembic_staging.ini upgrade head\nalembic -c migrations/postgres/alembic_analytics.ini upgrade head\nalembic -c migrations/postgres/alembic_portfolio.ini upgrade head\n```\n\nSee `docs/setup.md` for full environment variable reference.\n\n---\n\n## Running\n\n```sh\n# React frontend\ncd vault/frontend \u0026\u0026 npm install \u0026\u0026 npm run dev   # http://localhost:5173\n\n# FastAPI\ncd vault \u0026\u0026 uvicorn backend.api.main:app --reload --port 8001\n\n# Prefect pipelines\ncd vault \u0026\u0026 prefect deploy --all\n```\n\n---\n\n## Docs\n\n| Document | Description |\n| --- | --- |\n| `docs/architecture.md` | Layer diagram and key decisions |\n| `docs/setup.md` | Full setup guide |\n| `docs/commands.md` | Common commands |\n| `docs/design/doc-pipelines.md` | Pipeline pattern reference |\n| `docs/design/schema-analytics.md` | Gold schema reference |\n| `docs/design/schema-staging.md` | Silver schema reference |\n| `docs/design/metrics-reference.md` | Dashboard metrics catalogue |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakin-mustapha%2Fportfolio-management-platform","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fakin-mustapha%2Fportfolio-management-platform","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakin-mustapha%2Fportfolio-management-platform/lists"}