Update README to reflect all features added since initial docs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-06 20:43:06 +02:00
parent d90ac5365a
commit d5197cde14
+40 -20
View File
@@ -1,16 +1,19 @@
# BTC Portfolio Tracker # BTC Portfolio Tracker
A full-stack Bitcoin portfolio tracker with live EUR pricing, purchase history, and interactive charts. A full-stack Bitcoin portfolio tracker with live EUR pricing, purchase/sell history, candlestick charts, and price predictions.
--- ---
## Features ## Features
- **Live BTC price** — fetched from CoinGecko in EUR - **Live BTC price** — fetched from CoinGecko in EUR, with cached fallback and stale warning
- **Purchase tracking** — log BTC buys with amount (EUR) and price per BTC - **Purchase tracking** — log BTC buys with amount (EUR), price per BTC, and a custom date
- **Portfolio stats** — total invested, current value, profit/loss - **Sell tracking** — log BTC sells with BTC amount, price per BTC, and a custom date
- **Interactive charts** — portfolio value over time and 1-year BTC price history - **Portfolio stats** — total invested, current value, profit/loss, net BTC held
- **Edit & delete** — manage purchases with inline editing - **Price prediction** — enter a target BTC price to see projected portfolio value and P&L
- **Interactive charts** — portfolio value over time and BTC candlestick chart (OHLC stored locally)
- **Edit & delete** — inline editing and deletion for both purchases and sells
- **Admin panel** — admin users can create, list, and delete accounts
- **JWT authentication** — secure per-user portfolios - **JWT authentication** — secure per-user portfolios
--- ---
@@ -18,12 +21,12 @@ A full-stack Bitcoin portfolio tracker with live EUR pricing, purchase history,
## Tech Stack ## Tech Stack
| Layer | Technology | | Layer | Technology |
|----------|-------------------------------------| |----------|-----------------------------------------|
| Frontend | React 18, Chart.js, dark theme | | Frontend | React 18, Chart.js, dark theme |
| Backend | FastAPI, SQLAlchemy, SQLite | | Backend | FastAPI, SQLAlchemy, SQLite |
| Auth | JWT (HS256, 24h expiry) + bcrypt | | Auth | JWT (HS256, 24h expiry) + bcrypt |
| Pricing | CoinGecko API (EUR) | | Pricing | CoinGecko API (EUR) |
| Deploy | Docker + Docker Compose | | Deploy | Docker + Docker Compose + nginx |
--- ---
@@ -65,26 +68,31 @@ btc-portfolio/
├── backend/ ├── backend/
│ └── app/ │ └── app/
│ ├── main.py # FastAPI app + CORS │ ├── main.py # FastAPI app + CORS
│ ├── models.py # User & Purchase ORM models │ ├── models.py # User, Purchase, Sell, OHLCCandle ORM models
│ ├── auth.py # JWT + bcrypt │ ├── auth.py # JWT + bcrypt
│ ├── dependencies.py # Auth dependency injection │ ├── dependencies.py # Auth dependency injection
│ ├── routes/ │ ├── routes/
│ │ ├── users.py # POST /register, POST /login │ │ ├── users.py # POST /register, POST /login
│ │ ├── purchases.py # CRUD /purchases │ │ ├── purchases.py # CRUD /purchases
│ │ ├── sells.py # CRUD /sells
│ │ ├── stats.py # GET /stats │ │ ├── stats.py # GET /stats
│ │ ── history.py # GET /history (365-day BTC prices) │ │ ── history.py # GET /history (365-day BTC prices)
│ │ ├── candles.py # GET /candles (OHLC data + purchases overlay)
│ │ └── admin.py # GET/POST/DELETE /admin/users
│ └── services/ │ └── services/
│ └── btc.py # CoinGecko integration │ └── btc.py # CoinGecko integration
└── frontend/ └── frontend/
└── src/ └── src/
├── App.js # Routing ├── App.js # Routing
├── pages/ ├── pages/
│ └── Dashboard.js # Main view │ └── Dashboard.js # Main view: stats, predictions, charts, tables
└── components/ └── components/
├── AddPurchase.js # Purchase form ├── AddPurchase.js # Purchase form (amount EUR, price, date)
├── PurchaseList.js # Purchase table (edit/delete) ├── PurchaseList.js # Purchase table (inline edit/delete)
├── PortfolioChart.js # Invested vs current value ├── AddSell.js # Sell form (BTC amount, price, date)
── BTCHistoryChart.js # 1-year BTC price history ── SellList.js # Sell table (inline edit/delete)
├── PortfolioChart.js # Invested vs current value over time
└── BTCCandlestickChart.js # OHLC candlestick chart with purchase markers
``` ```
--- ---
@@ -92,15 +100,23 @@ btc-portfolio/
## API Endpoints ## API Endpoints
| Method | Endpoint | Description | Auth | | Method | Endpoint | Description | Auth |
|--------|-------------------|------------------------------|------| |--------|------------------------|------------------------------------|-------|
| POST | `/register` | Create account | No | | POST | `/register` | Create account | No |
| POST | `/login` | Get JWT token | No | | POST | `/login` | Get JWT token | No |
| GET | `/purchases` | List user purchases | Yes | | GET | `/purchases` | List user purchases | Yes |
| POST | `/purchases` | Add a purchase | Yes | | POST | `/purchases` | Add a purchase | Yes |
| PUT | `/purchases/{id}` | Edit a purchase | Yes | | PUT | `/purchases/{id}` | Edit a purchase | Yes |
| DELETE | `/purchases/{id}` | Delete a purchase | Yes | | DELETE | `/purchases/{id}` | Delete a purchase | Yes |
| GET | `/stats` | Portfolio stats (P&L) | Yes | | GET | `/sells` | List user sells | Yes |
| POST | `/sells` | Add a sell | Yes |
| PUT | `/sells/{sell_id}` | Edit a sell | Yes |
| DELETE | `/sells/{sell_id}` | Delete a sell | Yes |
| GET | `/stats` | Portfolio stats (P&L, net BTC) | Yes |
| GET | `/history` | 365-day BTC price history | Yes | | GET | `/history` | 365-day BTC price history | Yes |
| GET | `/candles` | OHLC candles + purchase overlay | Yes |
| GET | `/admin/users` | List all users (admin only) | Admin |
| POST | `/admin/users` | Create a user (admin only) | Admin |
| DELETE | `/admin/users/{id}` | Delete a user (admin only) | Admin |
--- ---
@@ -109,14 +125,18 @@ btc-portfolio/
SQLite, stored at `/app/data/btc_portfolio.db` (persisted via Docker volume). SQLite, stored at `/app/data/btc_portfolio.db` (persisted via Docker volume).
| Table | Columns | | Table | Columns |
|-------------|------------------------------------------------------| |----------------|---------------------------------------------------------------|
| `users` | id, username (unique), password (bcrypt hash) | | `users` | id, username (unique), password (bcrypt hash), is_admin |
| `purchases` | id, amount_eur, price_eur, created_at, user_id (FK) | | `purchases` | id, amount_eur, price_eur, created_at, user_id (FK) |
| `sells` | id, btc_amount, price_eur, created_at, user_id (FK) |
| `ohlc_candles` | id, date (unique, YYYY-MM-DD), open, high, low, close |
--- ---
## Notes ## Notes
- The `SECRET_KEY` in `auth.py` is hardcoded — use an environment variable in production. - The `SECRET_KEY` in `auth.py` is hardcoded — use an environment variable in production.
- CoinGecko requests are unauthenticated; failures return `0.0` gracefully. - CoinGecko requests are unauthenticated; failures fall back to the last cached price with a UI warning.
- OHLC candle data is fetched from CoinGecko and stored locally to reduce API calls.
- CORS is restricted to `localhost:3000` by default. - CORS is restricted to `localhost:3000` by default.
- The frontend is served via nginx in the Docker production setup.