Convert documentation to MkDocs with Material theme for GitHub Pages hosting. Includes comprehensive guides for API, CLI, desktop app, and development. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
18 KiB
Architecture
This document provides a detailed overview of the Mining Platform architecture, design decisions, and component interactions.
High-Level Architecture
The Mining Platform follows a modular, layered architecture:
┌─────────────────────────────────────────────────────────┐
│ User Interfaces │
│ ┌──────────┐ ┌───────────────┐ ┌─────────────────┐ │
│ │ CLI │ │ Web Dashboard │ │ Desktop App │ │
│ │ (Cobra) │ │ (Angular) │ │ (Wails+Angular)│ │
│ └────┬─────┘ └───────┬───────┘ └────────┬────────┘ │
└───────┼────────────────┼───────────────────┼───────────┘
│ │ │
└────────────────┼───────────────────┘
│
┌────────────────────────┼───────────────────────────────┐
│ REST API Layer (Gin) │
│ /api/v1/mining/* │
└────────────────────────┬───────────────────────────────┘
│
┌────────────────────────┼───────────────────────────────┐
│ Core Business Logic (pkg/mining) │
│ ┌──────────────┐ ┌─────────────┐ ┌───────────────┐ │
│ │ Manager │ │ Miner │ │ Profile │ │
│ │ Interface │ │ Implemen- │ │ Manager │ │
│ │ │ │ tations │ │ │ │
│ └──────┬───────┘ └──────┬──────┘ └───────┬───────┘ │
└─────────┼──────────────────┼─────────────────┼─────────┘
│ │ │
┌─────────┼──────────────────┼─────────────────┼─────────┐
│ System Layer (OS, Filesystem, Processes) │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Mining Software (XMRig, T-Rex, lolMiner, etc.) │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
Core Components
Manager Interface
The ManagerInterface is the central abstraction for miner lifecycle management.
Location: pkg/mining/manager.go
Purpose:
- Provides a contract for miner operations
- Enables testing through mocking
- Supports multiple miner implementations
- Manages running miners in-memory
Interface Definition:
type ManagerInterface interface {
StartMiner(minerType string, config *Config) (Miner, error)
StopMiner(name string) error
GetMiner(name string) (Miner, error)
ListMiners() []Miner
ListAvailableMiners() []AvailableMiner
GetMinerHashrateHistory(name string) ([]HashratePoint, error)
Stop()
}
Implementation Details:
- Maintains a
map[string]Minerfor running miners - Automatically collects statistics every 10 seconds
- Supports autostart from configuration
- Thread-safe with mutex locks
Miner Interface
The Miner interface defines the contract for all miner implementations.
Location: pkg/mining/mining.go
Interface Definition:
type Miner interface {
GetName() string
GetStats() (*PerformanceMetrics, error)
Stop() error
IsRunning() bool
GetConfig() *Config
GetHashrateHistory() []HashratePoint
}
Implementations:
- XMRigMiner: CPU/GPU mining for RandomX and CryptoNight
- TRexMiner: NVIDIA GPU mining for KawPow, Ethash (future)
- LolMiner: AMD/NVIDIA mining for Ethash, Beam (future)
BaseMiner
Provides shared functionality for all miner implementations.
Location: pkg/mining/miner.go
Features:
- Binary discovery and installation
- Archive extraction (tar.gz, tar.xz, zip)
- Download from URLs with progress tracking
- Hashrate history management
- XDG directory compliance
Key Methods:
func (m *BaseMiner) InstallFromURL(url string) error
func (m *BaseMiner) FindBinary(name string) (string, error)
func (m *BaseMiner) AddHashratePoint(hashrate float64)
func (m *BaseMiner) GetHashrateHistory() []HashratePoint
Hashrate History:
- High-resolution: 10-second intervals, 5-minute retention
- Low-resolution: 1-minute averages, 24-hour retention
- Automatically manages data retention
XMRig Implementation
Complete implementation for XMRig miner.
Files:
pkg/mining/xmrig.go: Core implementationpkg/mining/xmrig_start.go: Startup logicpkg/mining/xmrig_stats.go: Statistics parsing
Architecture:
┌─────────────────────────────────────────────┐
│ XMRigMiner │
│ ┌─────────────────────────────────────┐ │
│ │ BaseMiner (embedded) │ │
│ │ - Binary management │ │
│ │ - Hashrate history │ │
│ └─────────────────────────────────────┘ │
│ │
│ Start() → Generate config.json │
│ → Execute xmrig binary │
│ → Capture stdout/stderr │
│ → Monitor process │
│ │
│ GetStats() → Poll HTTP API │
│ → Parse JSON response │
│ → Return PerformanceMetrics │
│ │
│ Stop() → Send SIGTERM │
│ → Wait for graceful shutdown │
│ → Force kill if needed │
└─────────────────────────────────────────────┘
Configuration Generation:
- Creates JSON config file
- Supports CPU and GPU mining
- Handles pool authentication
- Manages algorithm selection
- Configures API endpoint for stats
Statistics Collection:
- Polls XMRig HTTP API (default:
http://127.0.0.1:44321/1/summary) - Parses JSON response
- Extracts hashrate, shares, connection info
- Updates hashrate history
Service Layer (REST API)
Exposes the Manager functionality via HTTP endpoints.
Location: pkg/mining/service.go
Framework: Gin Web Framework
Features:
- RESTful API design
- Swagger documentation
- CORS support
- JSON request/response
- Error handling middleware
- Route grouping
Route Organization:
/api/v1/mining
├── /info # GET - System info
├── /doctor # POST - Diagnostics
├── /update # POST - Check updates
├── /miners
│ ├── / # GET - List miners
│ ├── /available # GET - Available types
│ ├── /:miner_type # POST - Start miner
│ ├── /:miner_name # DELETE - Stop miner
│ ├── /:miner_name/stats # GET - Get statistics
│ ├── /:miner_type/install # POST - Install miner
│ └── /:miner_type/uninstall # DELETE - Uninstall
└── /profiles
├── / # GET - List profiles
├── / # POST - Create profile
├── /:id # GET - Get profile
├── /:id # PUT - Update profile
├── /:id # DELETE - Delete profile
└── /:id/start # POST - Start from profile
Middleware Stack:
- Logger
- Recovery (panic handler)
- CORS
- Request validation
- Response formatter
Profile Manager
Manages saved mining configurations.
Location: pkg/mining/profile_manager.go
Storage: JSON file at ~/.config/lethean-desktop/mining_profiles.json
Data Structure:
type MiningProfile struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
MinerType string `json:"minerType"`
Config *Config `json:"config"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
Features:
- CRUD operations for profiles
- UUID-based profile IDs
- Atomic file writes
- Import/export support
- Validation
Config Manager
Handles autostart and last-used configurations.
Location: pkg/mining/config_manager.go
Storage: JSON file at ~/.config/lethean-desktop/mining_config.json
Features:
- Autostart configuration
- Last-used miner configs
- Preference storage
- Default settings
Data Flow
Starting a Miner
User Request
│
├─→ CLI: miner-ctrl start xmrig --config config.json
├─→ API: POST /api/v1/mining/miners/xmrig
└─→ Desktop: profileManager.start(profileId)
│
▼
Service Layer (service.go)
│
├─→ Validate request
├─→ Parse configuration
└─→ Call manager.StartMiner()
│
▼
Manager (manager.go)
│
├─→ Check if miner already running
├─→ Validate configuration
└─→ Create miner instance
│
▼
Miner Implementation (xmrig.go)
│
├─→ Generate config.json
├─→ Find/verify binary
├─→ Execute miner process
├─→ Capture output streams
└─→ Start statistics collection
│
▼
Manager
│
├─→ Store miner in running map
└─→ Return miner instance
│
▼
Service Layer
│
├─→ Format response
└─→ Return HTTP 200/201
Collecting Statistics
Background goroutine (every 10s)
│
▼
For each running miner:
│
├─→ miner.GetStats()
│ │
│ ├─→ Poll HTTP API
│ ├─→ Parse JSON
│ └─→ Return PerformanceMetrics
│
├─→ Extract hashrate
└─→ miner.AddHashratePoint(hashrate)
│
├─→ Store in high-res buffer
├─→ Update low-res averages
└─→ Prune old data
Retrieving Statistics (API Request)
Client: GET /api/v1/mining/miners/xmrig/stats
│
▼
Service Layer
│
├─→ Extract miner name
└─→ Call manager.GetMiner(name)
│
▼
Manager
│
├─→ Lookup in miners map
└─→ Return miner instance
│
▼
Service Layer
│
├─→ Call miner.GetStats()
├─→ Format response
└─→ Return JSON
Frontend Architecture (Angular)
Component Hierarchy
AppComponent
├── DashboardPage
│ ├── MinerStatusCard
│ ├── HashrateCard
│ ├── SharesCard
│ └── EarningsCard
├── MinersPage
│ ├── RunningMinersList
│ │ └── MinerCard
│ └── AvailableMinersList
│ └── MinerInstallCard
├── ProfilesPage
│ ├── ProfileList
│ │ └── ProfileCard
│ └── ProfileEditor
├── StatisticsPage
│ ├── HashrateChart
│ ├── SharesChart
│ └── TimeRangeSelector
├── PoolsPage
│ ├── RecommendedPools
│ └── CustomPoolForm
├── AdminPage
│ ├── SystemInfo
│ ├── MinerManagement
│ └── DiagnosticsPanel
└── SettingsPage
├── GeneralSettings
├── NotificationSettings
└── AdvancedSettings
Services
MinerService
- API communication
- Miner lifecycle management
- Statistics fetching
ProfileService
- Profile CRUD operations
- Profile storage
- Import/export
WebSocketService
- Real-time updates
- Event notifications
- Connection management
ThemeService
- Theme switching
- Preference persistence
State Management
The application uses RxJS for state management:
- Services emit observables
- Components subscribe to updates
- Automatic cleanup on destroy
- Centralized error handling
Desktop Application (Wails)
Architecture
┌─────────────────────────────────────────┐
│ Go Backend (main.go) │
│ ┌───────────────────────────────────┐ │
│ │ MiningService │ │
│ │ - Wraps pkg/mining.Manager │ │
│ │ - Exposes methods to frontend │ │
│ └────────────┬──────────────────────┘ │
└───────────────┼─────────────────────────┘
│ Wails Bindings
┌───────────────┼─────────────────────────┐
│ TypeScript Frontend │
│ ┌────────────┴──────────────────────┐ │
│ │ Angular Application │ │
│ │ (Embedded from ui/dist/browser) │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘
MiningService (miningservice.go):
- Binds Go methods to frontend
- Handles lifecycle events
- Manages application state
- Provides system tray integration
Auto-generated Bindings (frontend/bindings/):
- TypeScript definitions
- Type-safe Go method calls
- Event system integration
Modified XMRig Core
OpenCL Backend
Location: miner/core/src/backend/opencl/
Supported Algorithms:
- ETChash (Ethereum Classic)
- ProgPowZ (Zano)
- KawPow (Ravencoin)
Key Files:
cl/etchash/: OpenCL kernels for ETChashcl/progpowz/: OpenCL kernels for ProgPowZrunners/OclEtchashRunner.*: ETChash GPU runnerrunners/OclProgPowZRunner.*: ProgPowZ GPU runner
Algorithm Implementations
Location: miner/core/src/crypto/
ETChash:
ETCCache.cpp/h: DAG cache management- Ethash variant optimized for ETC
ProgPowZ:
- Custom ProgPow variant for Zano
- Period-based algorithm rotation
Build System
CMake-based build with conditional compilation:
option(WITH_OPENCL "Enable OpenCL backend" ON)
option(WITH_CUDA "Enable CUDA backend" ON)
Automatically detects:
- OpenCL SDK
- CUDA Toolkit
- GPU capabilities
Security Considerations
API Security
- No authentication by default (local use)
- Consider reverse proxy for production
- CORS enabled for web component
- Input validation on all endpoints
File System
- XDG Base Directory compliance
- Restricted file permissions (0644 for config, 0755 for binaries)
- Atomic file writes for configs
- Safe path handling (no path traversal)
Process Management
- Graceful shutdown (SIGTERM → SIGKILL)
- Process isolation
- Resource limits (if configured)
- Log rotation
Performance Optimizations
Hashrate History
- Two-tier storage (high-res + low-res)
- Automatic data pruning
- In-memory ring buffers
- Minimal memory footprint
Statistics Collection
- Background goroutine (non-blocking)
- Cached HTTP requests
- JSON parsing optimization
- Error resilience
Frontend
- Lazy loading of routes
- Virtual scrolling for large lists
- Chart data decimation
- Debounced API calls
Extensibility
Adding New Miners
- Implement
Minerinterface - Extend
BaseMinerfor common functionality - Register in
Manager - Add API endpoints if needed
Adding New Algorithms
- Add algorithm support to miner core
- Update configuration structs
- Add validation rules
- Update UI selectors
Adding New Frontends
The REST API is frontend-agnostic:
- Mobile apps (React Native, Flutter)
- CLI tools
- Third-party integrations
- Monitoring dashboards
Deployment Patterns
Single User (Local)
User Machine
├── miner-ctrl (CLI/API server)
├── Browser (accessing localhost:8080)
└── Mining software (XMRig, etc.)
Multi-User (Server)
Server
├── miner-ctrl (API server on 0.0.0.0:8080)
└── Mining software
Reverse Proxy (nginx)
├── HTTPS termination
├── Authentication
└── Rate limiting
Clients
├── Web browsers
├── Mobile apps
└── API clients
Desktop (Standalone)
Single Binary (Wails)
├── Embedded API server
├── Embedded frontend
└── Integrated mining software
Next Steps
- Review Development Guide for setup instructions
- Read Contributing Guidelines for contribution process
- See API Documentation for endpoint details