2025-08-28 17:12:42 +01:00
|
|
|
# ETF Trade Tracker
|
|
|
|
|
|
|
|
|
|
A web-based application for tracking ETF trades with multi-user authentication, portfolio management, and performance analysis.
|
|
|
|
|
|
|
|
|
|
## Features
|
|
|
|
|
|
|
|
|
|
- 🔐 **Multi-user Authentication** - Secure login system with admin and regular user roles
|
|
|
|
|
- 💼 **Portfolio Management** - Track your ETF positions, shares, and investments
|
|
|
|
|
- 📊 **Trade History** - Complete record of all buy/sell transactions
|
|
|
|
|
- 📈 **Gains/Losses Analysis** - Calculate performance with current market prices
|
2025-09-01 18:37:41 +01:00
|
|
|
- 📉 **Historical Price Tracking** - Store and view price update history with timestamps
|
|
|
|
|
- 💰 **Multi-Currency Support** - Full support for EUR, USD, and GBP currencies
|
|
|
|
|
- 🏦 **Cash Account Management** - Track savings accounts and cash transfers
|
|
|
|
|
- 📊 **Capital Gains Tax (CGT)** - Automatic CGT calculations with long-term rates
|
2025-08-28 17:12:42 +01:00
|
|
|
- 🎯 **Dashboard** - Overview of portfolio metrics and performance
|
|
|
|
|
- 👥 **Admin Panel** - User management for administrators
|
|
|
|
|
- 📱 **Responsive Design** - Works on desktop and mobile devices
|
|
|
|
|
- 💾 **SQLite Database** - Local database storage with user data isolation
|
|
|
|
|
|
|
|
|
|
## Screenshots
|
|
|
|
|
|
|
|
|
|
### Dashboard
|
|
|
|
|
Clean overview of your portfolio with key metrics and ETF breakdown.
|
|
|
|
|
|
|
|
|
|
### Trade Entry
|
2025-09-01 18:37:41 +01:00
|
|
|
Simple form to add new ETF trades with date/time and currency support (EUR/USD/GBP).
|
2025-08-28 17:12:42 +01:00
|
|
|
|
|
|
|
|
### Gains/Losses
|
|
|
|
|
Update current market prices to see real-time portfolio performance.
|
|
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
2025-08-28 17:26:24 +01:00
|
|
|
### Option 1: Direct Installation
|
|
|
|
|
|
|
|
|
|
#### Prerequisites
|
2025-08-28 17:12:42 +01:00
|
|
|
- Node.js (v14 or higher)
|
|
|
|
|
- npm
|
|
|
|
|
|
2025-08-28 17:26:24 +01:00
|
|
|
#### Setup
|
2025-08-28 17:12:42 +01:00
|
|
|
|
|
|
|
|
1. Clone the repository:
|
|
|
|
|
```bash
|
|
|
|
|
git clone git@teapot.hm.keyb.ie:kris/etf-trade-tracker.git
|
|
|
|
|
cd etf-trade-tracker
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. Install dependencies:
|
|
|
|
|
```bash
|
|
|
|
|
npm install
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3. Start the server:
|
|
|
|
|
```bash
|
|
|
|
|
npm start
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
4. Open your browser and navigate to:
|
|
|
|
|
```
|
|
|
|
|
http://localhost:3000
|
|
|
|
|
```
|
|
|
|
|
|
2025-08-28 17:26:24 +01:00
|
|
|
### Option 2: Container Installation (Podman/Docker)
|
|
|
|
|
|
|
|
|
|
#### Prerequisites
|
|
|
|
|
- Podman or Docker installed on your system
|
|
|
|
|
|
|
|
|
|
#### Using Podman
|
|
|
|
|
|
|
|
|
|
1. Clone the repository:
|
|
|
|
|
```bash
|
|
|
|
|
git clone git@teapot.hm.keyb.ie:kris/etf-trade-tracker.git
|
|
|
|
|
cd etf-trade-tracker
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. Build the container image:
|
|
|
|
|
```bash
|
|
|
|
|
podman build -t etf-tracker .
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3. Run the container:
|
|
|
|
|
```bash
|
|
|
|
|
podman run -d \
|
|
|
|
|
--name etf-tracker \
|
|
|
|
|
-p 3000:3000 \
|
|
|
|
|
-v etf_data:/app/data \
|
|
|
|
|
etf-tracker
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
4. Open your browser and navigate to:
|
|
|
|
|
```
|
|
|
|
|
http://localhost:3000
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### Using Docker Compose
|
|
|
|
|
|
|
|
|
|
1. Clone the repository:
|
|
|
|
|
```bash
|
|
|
|
|
git clone git@teapot.hm.keyb.ie:kris/etf-trade-tracker.git
|
|
|
|
|
cd etf-trade-tracker
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. Start with docker-compose:
|
|
|
|
|
```bash
|
|
|
|
|
docker-compose up -d
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3. Open your browser and navigate to:
|
|
|
|
|
```
|
|
|
|
|
http://localhost:3000
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### Container Management
|
|
|
|
|
|
|
|
|
|
**View logs:**
|
|
|
|
|
```bash
|
|
|
|
|
podman logs etf-tracker
|
|
|
|
|
# or
|
|
|
|
|
docker-compose logs
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Stop the container:**
|
|
|
|
|
```bash
|
|
|
|
|
podman stop etf-tracker
|
|
|
|
|
# or
|
|
|
|
|
docker-compose down
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Start the container:**
|
|
|
|
|
```bash
|
|
|
|
|
podman start etf-tracker
|
|
|
|
|
# or
|
|
|
|
|
docker-compose up -d
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Remove container and data:**
|
|
|
|
|
```bash
|
|
|
|
|
podman rm etf-tracker
|
|
|
|
|
podman volume rm etf_data
|
|
|
|
|
# or
|
|
|
|
|
docker-compose down -v
|
|
|
|
|
```
|
|
|
|
|
|
2025-08-28 17:12:42 +01:00
|
|
|
## Default Credentials
|
|
|
|
|
|
|
|
|
|
When you first run the application, a default admin user is created:
|
|
|
|
|
|
|
|
|
|
- **Username:** `admin`
|
|
|
|
|
- **Password:** `admin123`
|
|
|
|
|
|
|
|
|
|
⚠️ **Important:** Change the admin password after first login for security.
|
|
|
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
|
|
### For Regular Users
|
|
|
|
|
|
|
|
|
|
1. **Login** - Use credentials provided by your administrator
|
|
|
|
|
2. **Add Trades** - Navigate to "Add Trade" to record buy/sell transactions
|
|
|
|
|
3. **View Portfolio** - Check your holdings and allocation in the Portfolio section
|
|
|
|
|
4. **Track Performance** - Update current prices in Gains/Losses to see real-time performance
|
|
|
|
|
5. **Export Data** - Export your trade history as JSON from Trade History
|
|
|
|
|
|
|
|
|
|
### For Administrators
|
|
|
|
|
|
|
|
|
|
1. **User Management** - Access Admin Panel from the sidebar to create/delete users
|
|
|
|
|
2. **Create Users** - Add new users with regular or admin privileges
|
|
|
|
|
3. **Monitor System** - View all users and their last login times
|
|
|
|
|
|
|
|
|
|
## API Endpoints
|
|
|
|
|
|
|
|
|
|
### Authentication
|
|
|
|
|
- `POST /api/login` - User login
|
|
|
|
|
- `POST /api/logout` - User logout
|
|
|
|
|
- `GET /api/me` - Get current user info
|
|
|
|
|
|
|
|
|
|
### Trades
|
|
|
|
|
- `GET /api/trades` - Get user's trades
|
|
|
|
|
- `POST /api/trades` - Add new trade
|
|
|
|
|
- `DELETE /api/trades/:id` - Delete specific trade
|
|
|
|
|
- `DELETE /api/trades` - Clear all user trades
|
|
|
|
|
|
|
|
|
|
### Portfolio
|
|
|
|
|
- `GET /api/portfolio-summary` - Get portfolio summary
|
|
|
|
|
|
|
|
|
|
### Admin (Admin Only)
|
|
|
|
|
- `GET /api/admin/users` - List all users
|
|
|
|
|
- `POST /api/admin/users` - Create new user
|
|
|
|
|
- `DELETE /api/admin/users/:id` - Delete user
|
|
|
|
|
|
|
|
|
|
## Database Schema
|
|
|
|
|
|
|
|
|
|
### Users Table
|
|
|
|
|
- `id` - Primary key
|
|
|
|
|
- `username` - Unique username
|
|
|
|
|
- `password_hash` - Bcrypt hashed password
|
|
|
|
|
- `email` - Optional email address
|
|
|
|
|
- `is_admin` - Boolean admin flag
|
|
|
|
|
- `created_at` - Account creation timestamp
|
|
|
|
|
- `last_login` - Last login timestamp
|
|
|
|
|
|
|
|
|
|
### Trades Table
|
|
|
|
|
- `id` - Primary key
|
|
|
|
|
- `user_id` - Foreign key to users table
|
|
|
|
|
- `etf_symbol` - ETF ticker symbol
|
|
|
|
|
- `trade_type` - 'buy' or 'sell'
|
|
|
|
|
- `shares` - Number of shares
|
|
|
|
|
- `price` - Price per share
|
2025-09-01 18:37:41 +01:00
|
|
|
- `currency` - 'EUR', 'USD', or 'GBP'
|
2025-08-28 17:12:42 +01:00
|
|
|
- `trade_datetime` - Date and time of trade
|
|
|
|
|
- `fees` - Optional trading fees
|
|
|
|
|
- `notes` - Optional trade notes
|
|
|
|
|
- `total_value` - Calculated total value
|
|
|
|
|
- `created_at` - Record creation timestamp
|
|
|
|
|
|
|
|
|
|
## Configuration
|
|
|
|
|
|
|
|
|
|
### Environment Variables
|
|
|
|
|
|
|
|
|
|
- `PORT` - Server port (default: 3000)
|
|
|
|
|
|
|
|
|
|
### Session Configuration
|
|
|
|
|
|
|
|
|
|
The application uses express-session with the following settings:
|
|
|
|
|
- Session secret: `etf-tracker-secret-key` (change in production)
|
|
|
|
|
- Session duration: 24 hours
|
|
|
|
|
- Secure cookies: disabled (enable for HTTPS)
|
|
|
|
|
|
|
|
|
|
## Security Features
|
|
|
|
|
|
|
|
|
|
- Password hashing using bcrypt
|
|
|
|
|
- Session-based authentication
|
|
|
|
|
- User data isolation
|
|
|
|
|
- Admin-only endpoints protection
|
|
|
|
|
- SQL injection prevention with parameterized queries
|
|
|
|
|
|
|
|
|
|
## Development
|
|
|
|
|
|
|
|
|
|
### Project Structure
|
|
|
|
|
```
|
|
|
|
|
├── server.js # Express server and API routes
|
|
|
|
|
├── index.html # Main HTML template
|
|
|
|
|
├── script.js # Frontend JavaScript
|
|
|
|
|
├── styles.css # CSS styles
|
|
|
|
|
├── package.json # Dependencies and scripts
|
|
|
|
|
├── .gitignore # Git ignore rules
|
|
|
|
|
└── README.md # This file
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Running in Development Mode
|
|
|
|
|
```bash
|
|
|
|
|
npm run dev
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This uses nodemon for automatic server restart on file changes.
|
|
|
|
|
|
|
|
|
|
## Contributing
|
|
|
|
|
|
|
|
|
|
1. Fork the repository
|
|
|
|
|
2. Create a feature branch
|
|
|
|
|
3. Make your changes
|
|
|
|
|
4. Test thoroughly
|
|
|
|
|
5. Submit a pull request
|
|
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
|
|
|
|
MIT License - see the code for details.
|
|
|
|
|
|
|
|
|
|
## Support
|
|
|
|
|
|
|
|
|
|
For issues or questions:
|
|
|
|
|
1. Check existing issues in the repository
|
|
|
|
|
2. Create a new issue with detailed description
|
|
|
|
|
3. Include steps to reproduce any bugs
|
|
|
|
|
|
|
|
|
|
## Changelog
|
|
|
|
|
|
2025-09-01 18:37:41 +01:00
|
|
|
### v1.2.0 (Latest)
|
|
|
|
|
- **Historical Price Tracking**: Store and view price update history for all ETFs
|
|
|
|
|
- **Price History Modal**: View timeline of price updates with timestamps
|
|
|
|
|
- **Persistent Pricing**: Automatically load latest prices on app startup
|
|
|
|
|
- **Multi-Currency Support**: Added British Pound (GBP) alongside EUR/USD
|
|
|
|
|
- **Enhanced UX**: Improved price update notifications and database persistence
|
|
|
|
|
|
|
|
|
|
### v1.1.0
|
|
|
|
|
- Comprehensive cash savings and transfers system
|
|
|
|
|
- Capital Gains Tax (CGT) calculations with 8+ year long-term rates
|
|
|
|
|
- Total holdings tracking across ETFs and cash accounts
|
|
|
|
|
- Enhanced portfolio analytics and reporting
|
|
|
|
|
|
2025-08-28 17:12:42 +01:00
|
|
|
### v1.0.0 (Initial Release)
|
|
|
|
|
- Multi-user authentication system
|
|
|
|
|
- ETF trade tracking
|
|
|
|
|
- Portfolio management
|
|
|
|
|
- Gains/losses calculation
|
|
|
|
|
- Admin panel
|
|
|
|
|
- Responsive design
|
|
|
|
|
- SQLite database integration
|