A full-stack ASP.NET Core 10 analytics platform migrated from a Windows Server IIS deployment to a Raspberry Pi 5 (16 GB) running Ubuntu bare-metal. Integrates Power BI embedding, Bollinger Band charting, a Go backend API, PostgreSQL, and a dual-LLM Natural Language SQL interface.
The same application — now leaner, faster, and running on an ARM64 single-board computer for a fraction of the cost.
All services co-located on the Raspberry Pi 5. Cloudflare Tunnel handles public-facing TLS termination, forwarding traffic to Kestrel on port 5050.
A pragmatic mix of Microsoft and open-source tooling, all running natively on ARM64 Linux.
stocks_mart materialized views.dbt_stocks.stocks_mart.All pages share the same dark orbital theme with CSS variables, system sans-serif font, and responsive Bootstrap layout.
| Method | Route | Description |
|---|---|---|
| GET | / | Animated orbital carousel — entry point to Power BI workspaces. |
| GET | /ws | Workspace browser — orbital carousel listing all Power BI workspaces. Lock badge on protected workspaces. |
| GET | /rkg/{workspaceId} | Report browser — lists all reports within a workspace. |
| GET | /rkg/{workspaceId}/{reportId} | Embedded report — full-screen Power BI iframe with collapsible page navigator. 🔒 Auth required for PROD |
| Method | Route | Description |
|---|---|---|
| GET | /bollinger/observatory | Market observatory — aggregated view of sectors, countries, and asset performance. |
| GET | /bollinger/magnificent7 | Magnificent 7 dashboard — AAPL, MSFT, GOOGL, AMZN, NVDA, META, TSLA side-by-side. |
| GET | /bollinger | Bollinger Bands — dual split-chart view with configurable ticker, period (1M–5Y), MA period, and std dev. |
| GET | /bollinger/cryptomarkets | Crypto markets — live coin list panel with price chart and volume overlay. |
| GET | /events | Historical events — overlays major market events on stock price charts. |
| GET | /elections | Election cycles — stock performance around presidential election dates. |
| Method | Route | Description |
|---|---|---|
| GET | /nlsql | NL→SQL interface — chat-style input, example picker, Ollama/OpenRouter/Both provider selector, live SQL display, tabular results, and optional Plotly chart. |
| Method | Route | Description |
|---|---|---|
| GET | /docs/dbt_pipeline_diagram.html | dbt pipeline diagram — visual overview of the stock data transformation pipeline. |
| GET | /docs/project-overview.html | This page — project overview, migration story, architecture, and endpoint reference. |
The ASP.NET Core app proxies all data requests to the Go microservice on port 8001. The NL→SQL controller exposes its own JSON endpoints for the browser to call directly.
| Method | Route | Description |
|---|---|---|
| GET | /bollinger/countries | G20 countries available in the stock database. |
| GET | /bollinger/sectors?country= | Market sectors, optionally filtered by country. |
| GET | /bollinger/tickers?country=§or= | Ticker list filtered by country and/or sector. |
| GET | /bollinger/data?ticker=&days=&period=&stddev= | Bollinger band OHLC + band data. Default: days=365, period=20, stddev=2.0. |
| GET | /bollinger/indices | Major market indices (S&P 500, NASDAQ, etc.). |
| GET | /bollinger/forex | Forex currency pairs and rates. |
| GET | /bollinger/crypto | Cryptocurrency price data. |
| GET | /bollinger/observatory/totals | Summary totals for the observatory dashboard. |
| GET | /bollinger/observatory/daily | Daily market activity snapshot. |
| GET | /bollinger/observatory/sectors | Sector-level aggregated performance. |
| GET | /bollinger/observatory/countries | Country-level aggregated performance. |
| GET | /bollinger/observatory/assets | Asset-class breakdown from the observatory. |
| GET | /bollinger/events/list | List of catalogued market events. |
| GET | /bollinger/events/data?ticker=&start_date=&end_date= | Stock price data for a ticker around a specific event window. |
| GET | /bollinger/elections/list | List of tracked election dates by country. |
| GET | /bollinger/elections/data?ticker=&days_before=730 | Price data centred on election dates for a given ticker. |
| Method | Route | Description |
|---|---|---|
| GET | /nlsql/modelinfo | Returns configured LLM model names for Ollama and OpenRouter. |
| POST | /nlsql/generate |
LLM inference — converts a natural language question to SQL. Body: { question, history[], provider }
|
| POST | /nlsql/query |
Database execution — runs a validated SELECT against PostgreSQL. Max 500 rows. Body: { sql }
|
All services co-located on the Raspberry Pi 5, managed by systemd.