Architecture Overview
The Mining Dashboard follows a modular architecture with clear separation of concerns.
High-Level Architecture
┌─────────────────────────────────────────────────────────────┐
│ Web Browser │
│ Angular UI (4200) │
└─────────────────────┬───────────────────────────────────────┘
│ HTTP/REST
┌─────────────────────▼───────────────────────────────────────┐
│ Go Backend (9090) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ REST API (Gin) │ │
│ │ /api/v1/mining/* │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────▼──────────────────────────────┐ │
│ │ Mining Manager │ │
│ │ - Process lifecycle - Stats collection │ │
│ │ - Profile management - Hashrate history │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────┬───────────┴────────────┬────────────────┐ │
│ │ XMRig │ TT-Miner │ Future... │ │
│ │ Adapter │ Adapter │ Miners │ │
│ └───────────┴────────────────────────┴────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ XMRig │ │TT-Miner │ │ SQLite │
│ Process │ │ Process │ │ DB │
└─────────┘ └─────────┘ └─────────┘
Component Responsibilities
Frontend (Angular)
| Component |
Purpose |
| Dashboard |
Real-time hashrate display, stats bar |
| Profiles |
CRUD for mining configurations |
| Console |
Live miner output with ANSI colors |
| Workers |
Running miner instances |
| Nodes |
P2P peer management |
Backend (Go)
| Package |
Purpose |
pkg/mining |
Core miner management, API service |
pkg/node |
P2P networking, identity, transport |
pkg/database |
SQLite persistence layer |
cmd/mining |
CLI commands via Cobra |
Data Flow
Starting a Miner
1. UI: POST /api/v1/mining/profiles/{id}/start
2. Service: Validates profile, calls Manager.StartMiner()
3. Manager: Creates miner instance (XMRig/TT-Miner)
4. Miner: Generates config, spawns process
5. Manager: Starts stats collection goroutine
6. Response: Returns miner name to UI
Stats Collection
Every 10 seconds:
1. Manager iterates running miners
2. Each miner adapter polls stats (HTTP API or stdout parsing)
3. Stats stored in memory + SQLite
4. UI polls /api/v1/mining/miners for updates
Storage
Configuration Files
~/.config/lethean-desktop/
├── mining_profiles.json # Saved profiles
├── miners.json # Autostart config
├── node.json # P2P identity
└── peers.json # Known peers
Data Files
~/.local/share/lethean-desktop/
├── miners/ # Installed miner binaries
│ ├── xmrig/
│ └── tt-miner/
├── node/
│ └── private.key # X25519 private key
└── mining.db # SQLite database
Key Design Decisions
| Decision |
Rationale |
| Interface-based miners |
Easy to add new miner types |
| Gorilla WebSocket |
P2P transport with good browser support |
| SQLite |
Zero-config persistence, embedded |
| Gin framework |
Fast, widely used Go HTTP framework |
| Angular standalone |
Modern, tree-shakable components |