🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
424 lines
14 KiB
Markdown
424 lines
14 KiB
Markdown
# Dangerous Pi - Development Guide for Claude
|
|
|
|
## Project Overview
|
|
|
|
Dangerous Pi is a modern web-based management interface for the Proxmark3 RFID research tool, designed to run on a Raspberry Pi Zero 2 W. It extends the existing pi-pm3 project with advanced features and a Python/FastAPI backend.
|
|
|
|
## Architecture
|
|
|
|
### Backend (Python + FastAPI)
|
|
- **Location**: `/app/backend/`
|
|
- **Framework**: FastAPI with async support
|
|
- **Database**: SQLite (aiosqlite)
|
|
- **Transport**: REST + WebSocket for real-time events
|
|
|
|
### Frontend (Remix.js)
|
|
- **Location**: `/app/frontend/`
|
|
- **Framework**: Remix v2 (React Router with SSR)
|
|
- **Styling**: Vanilla CSS (cyberpunk theme, ~15KB)
|
|
- **Charts**: Victory (cross-platform, mobile-first)
|
|
- **Transport**: REST API + WebSocket for notifications
|
|
- **Target Users**: Mobile (primary), Desktop (secondary)
|
|
|
|
### Key Components
|
|
|
|
1. **PM3 Worker** (`workers/pm3_worker.py`)
|
|
- Uses built-in `pm3` Python module from RfidResearchGroup/proxmark3
|
|
- API: `pm3.open(device)` and `.cmd(command)`
|
|
- Handles async command execution
|
|
- Single-threaded, sequential command processing
|
|
|
|
2. **PM3 Device Manager** (`managers/pm3_device_manager.py`)
|
|
- Multi-device support with unique device IDs
|
|
- Device discovery via pyudev
|
|
- Per-device worker management
|
|
- Firmware version tracking
|
|
|
|
3. **Session Manager** (`managers/session_manager.py`)
|
|
- Per-device session management
|
|
- Takeover mechanism for new sessions
|
|
- Idle timeout (default: 5 minutes)
|
|
|
|
4. **Update Manager** (`managers/update_manager.py`)
|
|
- Polls GitHub Releases API
|
|
- Downloads and applies updates
|
|
- Rebuilds PM3 client after updates
|
|
- WebSocket notifications for update status
|
|
|
|
5. **Service Layer** (`services/`)
|
|
- **ServiceContainer** - Dependency injection
|
|
- **PM3Service** - PM3 command execution
|
|
- **SystemService** - System operations
|
|
- **WiFiService** - WiFi management
|
|
- **UpdateService** - Update operations
|
|
|
|
6. **Wi-Fi Manager** (`managers/wifi_manager.py`)
|
|
- Detects available interfaces (wlan0, wlan1)
|
|
- Manages modes: AP, Client, Auto, Dual (client+AP)
|
|
- Integrates with existing RaspAP setup initially
|
|
|
|
7. **UPS Manager** (`managers/ups_manager.py`)
|
|
- Multiple driver support (auto-detection)
|
|
- PiSugar TCP driver
|
|
- I2C fuel gauge driver (MAX17040/48)
|
|
- Safe shutdown triggers
|
|
- Battery percentage reporting
|
|
|
|
8. **WebSocket Manager** (`websocket/`)
|
|
- Real-time event broadcasting
|
|
- Connection management
|
|
- Event types: system_stats, pm3_status, ups_battery, etc.
|
|
|
|
9. **BLE Manager** (`managers/ble_manager.py`)
|
|
- Uses built-in Pi Zero 2 W Bluetooth
|
|
- Sends notifications for updates, backups, low battery
|
|
- Auto-detects BLE capability
|
|
- **Planned**: Full GATT server for React Native app
|
|
- **Planned**: Command execution via BLE (offline operation)
|
|
|
|
10. **Plugin Manager** (`managers/plugin_manager.py`)
|
|
- Extensible plugin architecture
|
|
- Remote plugin installation from GitHub releases
|
|
- Automatic pip dependency management
|
|
- Hardware access (GPIO, I2C, SPI, serial, camera)
|
|
- Permission system for user consent
|
|
- See `.claude/instructions/plugin-architecture.md` for details
|
|
|
|
## Proxmark3 Python API
|
|
|
|
The RfidResearchGroup/proxmark3 (iceman fork) includes SWIG-based Python bindings:
|
|
|
|
```python
|
|
# Standalone mode (for our backend)
|
|
import pm3
|
|
device = pm3.open("/dev/ttyACM0")
|
|
result = device.cmd("hw status")
|
|
```
|
|
|
|
**Important Notes:**
|
|
- PM3 does NOT support streaming responses
|
|
- Most commands complete and return full output
|
|
- Use REST endpoints for commands
|
|
- Use WebSocket for backend-to-frontend notifications
|
|
|
|
## Current Status
|
|
|
|
### ✅ Completed (MVP Features)
|
|
- **Backend Foundation**
|
|
- FastAPI application with async support
|
|
- SQLite database (sessions, config, crash_reports, command_history)
|
|
- Health check endpoints
|
|
- Configuration management
|
|
- PM3 worker with built-in pm3 module integration (SWIG)
|
|
- PM3 device manager for multi-device support
|
|
- Session manager (per-device with takeover)
|
|
- Service layer (PM3Service, SystemService, WiFiService)
|
|
- WebSocket for real-time notifications
|
|
|
|
- **WiFi Manager (Full MVP)**
|
|
- Interface detection (USB vs built-in)
|
|
- Network scanning with signal strength
|
|
- Full mode switching (AP/Client/Dual/Auto/Off)
|
|
- Network connection with password support
|
|
- Hidden SSID support
|
|
- Saved networks management
|
|
- Forget network functionality
|
|
- Static IP configuration
|
|
- DHCP management
|
|
- 10 WiFi API endpoints
|
|
|
|
- **Frontend (Complete)**
|
|
- Cyberpunk-themed responsive UI
|
|
- Dashboard with system status
|
|
- PM3 command interface
|
|
- Settings with WiFi management
|
|
- Command logs
|
|
- Connection dialog with password input
|
|
- Saved networks UI
|
|
- Theme toggle (Dark/Light/Auto)
|
|
|
|
### ✅ Update Manager (Complete)
|
|
- GitHub releases API integration
|
|
- Automatic periodic update checks (configurable interval)
|
|
- Version comparison (semantic versioning)
|
|
- Update download with progress tracking
|
|
- Checksum verification (SHA256)
|
|
- Automatic installation with backup
|
|
- PM3 client rebuild after updates
|
|
- Rollback on installation failure
|
|
- 6 Update API endpoints
|
|
- Frontend UI with release notes and progress tracking
|
|
|
|
### 📋 Next Phase Features
|
|
|
|
**Visualization & Guided Workflows (In Planning)**
|
|
1. Victory charts integration (cross-platform)
|
|
2. PM3 output parsers (text → JSON)
|
|
3. Real-time tuning visualizations
|
|
4. Guided workflow framework
|
|
5. Mobile-optimized touch interactions
|
|
|
|
**Cross-Platform Apps (Planned)**
|
|
1. React Native mobile app (iOS/Android)
|
|
2. Electron desktop app (Windows/Mac/Linux)
|
|
3. Enhanced BLE manager (full feature parity)
|
|
4. Shared component library (~90% code reuse)
|
|
|
|
## Development Guidelines
|
|
|
|
### Code Style
|
|
- Use async/await throughout
|
|
- Type hints on all functions
|
|
- Docstrings for all modules and classes
|
|
- Keep functions focused and simple
|
|
|
|
### API Design
|
|
- REST for all client-initiated actions
|
|
- WebSocket for server-initiated notifications
|
|
- Clear error messages with appropriate status codes
|
|
- Consistent response format
|
|
|
|
### Security
|
|
- Run services as non-root user
|
|
- Optional authentication (configurable)
|
|
- Optional HTTPS (self-signed cert)
|
|
- Input validation on all endpoints
|
|
- No secrets in code (use environment variables)
|
|
|
|
### Testing Strategy
|
|
- Test endpoints with curl before building frontend
|
|
- Mock PM3 module for testing without hardware
|
|
- Test on actual Pi Zero 2 W for performance
|
|
|
|
## Data Visualization (Victory Charts)
|
|
|
|
### Why Victory?
|
|
Victory is the **only** major charting library designed for true cross-platform development:
|
|
- **Web**: Works with Remix/React
|
|
- **React Native**: `victory-native` with native rendering
|
|
- **Electron**: Same as web version
|
|
- **Mobile-First**: Touch gestures, responsive, 44px targets
|
|
- **Bundle Size**: ~50KB (acceptable with code splitting)
|
|
|
|
### Parser Layer Architecture
|
|
|
|
PM3 commands return text output. We need parsers to convert to structured data:
|
|
|
|
```python
|
|
# app/backend/parsers/pm3_output.py
|
|
|
|
def parse_antenna_tuning(output: str) -> dict:
|
|
"""Parse hw tune output into plottable data."""
|
|
# Input: "# LF antenna: 50.00 V @ 125.00 kHz"
|
|
# Output: {"voltage": 50.0, "frequency": 125.0}
|
|
|
|
def parse_waveform_data(output: str) -> dict:
|
|
"""Parse data samples into array."""
|
|
# Output: {"samples": [1, 2, 3, ...], "rate": 48000}
|
|
|
|
def parse_protocol_trace(output: str) -> dict:
|
|
"""Parse hf list output into structured frames."""
|
|
# Output: {"frames": [...], "timestamps": [...]}
|
|
```
|
|
|
|
### Enhanced API Response Format
|
|
|
|
```python
|
|
# New response format
|
|
class CommandWithDataResponse(BaseModel):
|
|
success: bool
|
|
output: str # Original text (for compatibility)
|
|
data: Optional[Dict] = None # Structured data for charts
|
|
visualization_type: Optional[str] = None # "waveform", "tune", "trace"
|
|
```
|
|
|
|
### Shared Chart Components
|
|
|
|
Create in `/app/shared/components/charts/` for cross-platform reuse:
|
|
|
|
```typescript
|
|
// TuneChart.tsx - Works on Web + React Native + Electron
|
|
import { VictoryLine, VictoryChart, VictoryAxis } from 'victory'
|
|
|
|
export function TuneChart({ data, title }) {
|
|
return (
|
|
<VictoryChart>
|
|
<VictoryLine data={data} x="frequency" y="voltage" />
|
|
</VictoryChart>
|
|
)
|
|
}
|
|
```
|
|
|
|
### Guided Workflow Framework
|
|
|
|
Multi-step wizards for common PM3 operations:
|
|
|
|
```typescript
|
|
// Workflow definition
|
|
const cloneMifareWorkflow = {
|
|
steps: [
|
|
{ id: 'tune', component: StepTuneAntenna, validation: () => tuned },
|
|
{ id: 'read', component: StepReadSource, validation: () => hasData },
|
|
{ id: 'write', component: StepWriteTarget }
|
|
]
|
|
}
|
|
```
|
|
|
|
### Testing Strategy
|
|
- Mock PM3 output for parser testing
|
|
- Test charts with sample data (no hardware needed)
|
|
- Verify touch interactions on actual mobile device
|
|
- Performance testing on Pi Zero 2 W
|
|
|
|
## File Structure
|
|
|
|
```
|
|
/home/work/dangerous-pi/
|
|
├── .claude/
|
|
│ ├── instructions/ # Custom instructions for Claude
|
|
│ │ └── plugin-architecture.md # Plugin system guide
|
|
│ └── plans/ # Implementation plans
|
|
├── app/
|
|
│ ├── backend/
|
|
│ │ ├── main.py # FastAPI app entry
|
|
│ │ ├── config.py # Configuration
|
|
│ │ ├── api/ # REST endpoints
|
|
│ │ │ ├── health.py # Health checks
|
|
│ │ │ ├── pm3.py # Proxmark3 commands
|
|
│ │ │ ├── system.py # System management
|
|
│ │ │ └── plugins.py # Plugin management
|
|
│ │ ├── websocket/ # WebSocket real-time events
|
|
│ │ │ ├── manager.py # Connection manager
|
|
│ │ │ ├── routes.py # WebSocket endpoint
|
|
│ │ │ └── notifications.py # Event broadcasting
|
|
│ │ ├── services/ # Business logic layer
|
|
│ │ │ ├── container.py # Dependency injection
|
|
│ │ │ ├── pm3_service.py # PM3 operations
|
|
│ │ │ ├── system_service.py
|
|
│ │ │ └── wifi_service.py
|
|
│ │ ├── workers/ # Background workers
|
|
│ │ │ └── pm3_worker.py # PM3 command executor
|
|
│ │ ├── managers/ # State management
|
|
│ │ │ ├── pm3_device_manager.py # Multi-device PM3
|
|
│ │ │ ├── session_manager.py
|
|
│ │ │ ├── update_manager.py
|
|
│ │ │ ├── wifi_manager.py
|
|
│ │ │ ├── ups_manager.py
|
|
│ │ │ ├── ups_drivers/ # UPS driver implementations
|
|
│ │ │ ├── ble_manager.py
|
|
│ │ │ └── plugin_manager.py # Plugin lifecycle
|
|
│ │ └── models/ # Database models
|
|
│ │ └── database.py
|
|
│ ├── frontend/ # Remix.js web UI
|
|
│ ├── plugins/ # Installed plugins
|
|
│ │ └── hello_world/ # Demo plugin
|
|
│ └── scripts/ # Helper scripts
|
|
├── data/ # SQLite database, backups
|
|
├── logs/ # Application logs
|
|
├── pi-gen/ # Custom OS image builder
|
|
├── requirements.txt # Python dependencies
|
|
└── claude.md # This file
|
|
|
|
```
|
|
|
|
## Integration with Existing pi-pm3
|
|
|
|
The existing pi-pm3 project provides:
|
|
- Custom Raspberry Pi OS image (pi-gen based)
|
|
- RaspAP (PHP-based WiFi management on port 80)
|
|
- ttyd web terminals (bash on 8000, pm3 on 8080)
|
|
- PM3 client built and installed
|
|
|
|
Dangerous Pi will:
|
|
- Keep RaspAP initially, potentially replace later
|
|
- Replace ttyd terminals with web UI
|
|
- Add FastAPI backend on port 8000 (conflicts with ttyd-bash)
|
|
- Update pi-gen stage to install new application
|
|
|
|
## Next Steps for Implementation
|
|
|
|
1. **Complete core backend**: ✅ DONE
|
|
- PM3 worker with SWIG bindings
|
|
- PM3 device manager for multi-device
|
|
- Session manager with per-device locking
|
|
- WebSocket event system for notifications
|
|
|
|
2. **Add system management**:
|
|
- Wi-Fi detection and mode switching
|
|
- Update manager with GitHub integration
|
|
- UPS monitoring daemon
|
|
|
|
3. **Build frontend**:
|
|
- Decide: Remix vs minimal SPA
|
|
- Dashboard with status indicators
|
|
- Command interface (simpler than full terminal)
|
|
- Settings pages
|
|
|
|
4. **Create installer**:
|
|
- Update pi-gen stage scripts
|
|
- Create systemd service units
|
|
- Handle port conflicts with existing ttyd
|
|
|
|
## Useful Resources
|
|
|
|
- [Proxmark3 Python API Discussion](https://github.com/RfidResearchGroup/proxmark3/issues/897)
|
|
- [Python API Bug Fix](https://github.com/RfidResearchGroup/proxmark3/issues/1870)
|
|
- [RaspAP Documentation](https://docs.raspap.com)
|
|
- [FastAPI Documentation](https://fastapi.tiangolo.com)
|
|
|
|
## Environment Variables
|
|
|
|
```bash
|
|
# PM3 Configuration
|
|
PM3_DEVICE=/dev/ttyACM0
|
|
PM3_TIMEOUT=30
|
|
|
|
# Session Configuration
|
|
SESSION_TIMEOUT=300
|
|
|
|
# Server Configuration
|
|
HOST=0.0.0.0
|
|
PORT=8000
|
|
|
|
# Update Configuration
|
|
GITHUB_REPO=yourusername/dangerous-pi
|
|
UPDATE_CHECK_INTERVAL=3600
|
|
|
|
# Wi-Fi Configuration
|
|
WLAN_INTERFACE=wlan0
|
|
USB_WLAN_INTERFACE=wlan1
|
|
|
|
# UPS Configuration
|
|
UPS_I2C_ADDRESS=0x36
|
|
UPS_CHECK_INTERVAL=60
|
|
|
|
# BLE Configuration
|
|
BLE_ENABLED=true
|
|
BLE_DEVICE_NAME=DangerousPi
|
|
|
|
# Security
|
|
AUTH_ENABLED=false
|
|
HTTPS_ENABLED=false
|
|
```
|
|
|
|
## Common PM3 Commands
|
|
|
|
For testing the PM3 worker:
|
|
|
|
```
|
|
hw version # Get hardware/firmware version
|
|
hw status # Get hardware status
|
|
hw tune # Tune antenna
|
|
hf search # Search for HF tags
|
|
lf search # Search for LF tags
|
|
hf mf autopwn # Auto-attack MIFARE Classic
|
|
```
|
|
|
|
## Notes
|
|
- Pi Zero 2 W has limited CPU/RAM - optimize for efficiency
|
|
- WebSocket provides bidirectional real-time communication with better reconnection handling
|
|
- SQLite is sufficient for single-device deployment
|
|
- Keep bundles small for faster load times
|
|
- Test thoroughly on actual hardware, not just desktop
|
|
- Multi-device PM3 support requires per-device session management
|