Personal portfolio dashboard for tracking US equities — live prices, daily snapshots, AI-powered portfolio analysis, and a company news feed scoped to held symbols.
Stack: .NET 8 · Blazor WASM · EF Core 8 · Azure SQL · Finnhub · Azure AI Foundry
All credentials are stored in .NET user-secrets (outside the repo).
Create an Azure SQL database (or use SQL Server / LocalDB). Then:
cd src/Portlite.Api
dotnet user-secrets set "ConnectionStrings:Default" "Server=tcp:<your-server>.database.windows.net,1433;Initial Catalog=portlite-dev;User ID=<admin>;Password=<pwd>;Encrypt=True;"Get a free key at finnhub.io:
dotnet user-secrets set "Finnhub:ApiKey" "<your_key>"Deploy any chat model in Azure AI Foundry, then:
dotnet user-secrets set "AzureFoundry:Endpoint" "https://<resource>.services.ai.azure.com/models"
dotnet user-secrets set "AzureFoundry:ApiKey" "<your_key>"
dotnet user-secrets set "AzureFoundry:Model" "gpt-4o-mini"dotnet ef database update \
--project src/Portlite.Infrastructure \
--startup-project src/Portlite.Apicd src/Portlite.Api && dotnet run --launch-profile http # http://localhost:5101
cd src/Portlite.Web && dotnet run --launch-profile http # http://localhost:5012Open http://localhost:5012.
src/
Portlite.Domain/ entities, value objects, enums
Portlite.Shared/ DTOs (shared between API and Web)
Portlite.Infrastructure/ EF Core, migrations, market data providers
Portlite.Api/ controllers, services, hosted jobs
Portlite.Web/ Blazor WASM SPA
tests/
Portlite.Api.Tests/
- Daily snapshots are written by a background hosted service in the API.
- News + price data are cached in-memory with TTL to stay under Finnhub free-tier limits (60 req/min).
- AI analysis responses are persisted per portfolio with a content hash to allow cache reuse.
MIT © Berk Arat