A high-performance, cross-platform ECU log viewer written in Rust.
- UltraLog
UltraLog is a desktop application designed for automotive tuners, engineers, and enthusiasts who need to analyze ECU (Engine Control Unit) log data. Built with Rust for maximum performance, it handles large log files (millions of data points) smoothly using advanced downsampling algorithms while maintaining visual accuracy.
Key Benefits:
- Fast - Handles massive log files without lag using LTTB downsampling
- Universal - Supports multiple ECU formats in one unified interface
- Cross-platform - Runs natively on Windows, macOS, and Linux
- Accessible - Colorblind-friendly palette and clear visualization
- Multi-channel overlay - Plot up to 10 data channels simultaneously on a single chart
- Normalized display - All channels scaled 0-1 for easy comparison regardless of original units
- Min/Max legend - Peak values displayed for each channel at a glance
- Real-time cursor values - Legend shows live values at cursor position with proper units
- High-performance rendering - LTTB (Largest Triangle Three Buckets) algorithm reduces millions of points to 2,000 while preserving visual fidelity
- Interactive timeline - Click anywhere on the chart or use the scrubber to navigate
- Playback controls - Play, pause, stop with adjustable speed (0.25x, 0.5x, 1x, 2x, 4x, 8x)
- Cursor tracking mode - Keep the cursor centered while scrubbing through data
- Manual time input - Type a specific time in seconds to jump directly to that position
- Tab-based interface - Open multiple log files with Chrome-style tabs
- Drag and drop - Simply drop files onto the window to load them
- Per-tab state - Each tab maintains its own channel selections and view settings
- Duplicate detection - Prevents loading the same file twice
Configurable units for 8 measurement categories:
- Temperature - Kelvin, Celsius, Fahrenheit
- Pressure - kPa, PSI, Bar
- Speed - km/h, mph
- Distance - km, miles
- Fuel Economy - L/100km, MPG
- Volume - Liters, Gallons
- Flow Rate - L/min, GPM
- Acceleration - m/s², g
- PNG Export - Save chart views as PNG images
- PDF Export - Generate PDF reports of your visualizations
- Scatter Plot - XY scatter visualization for channel correlation analysis
- Normalization Editor - Create custom field name mappings for cross-ECU comparison
- Field Normalization - Maps ECU-specific channel names to standard names (e.g., "Act_AFR" → "AFR")
- Colorblind mode - Wong's optimized color palette designed for deuteranopia, protanopia, and tritanopia
- Custom font - Clear, readable Outfit typeface
- Toast notifications - Non-intrusive feedback for user actions
- File type: CSV exports from Haltech NSP software
- Features: 50+ channel types with automatic unit conversion
- Supported data: Pressure, temperature, RPM, throttle position, boost, ignition timing, fuel trim, and more
- File type: CSV exports (semicolon or tab-delimited) from EMU Pro software
- Features: Hierarchical channel paths, automatic unit inference
- Note: Native
.emuprologbinary format not supported; export to CSV from EMU Pro
- File type: CSV exports from RomRaider ECU logging software
- Features: Automatic unit extraction from column headers, Subaru ECU parameter support
- Supported data: Engine speed, load, AFR corrections, timing, knock, temperatures, and all standard Subaru ECU parameters
- File type: MegaLogViewer binary format (
.mlg) - Features: Binary format parsing with field type detection
- Supported data: All standard Speeduino/rusEFI channels with timestamps
- MegaSquirt
- AEM
- MaxxECU
- MoTeC
- Link ECU
Download the latest release for your platform from the Releases page:
| Platform | Download | Notes |
|---|---|---|
| Windows x64 | ultralog-windows.zip |
Windows 10/11 |
| macOS Intel | ultralog-macos-intel.tar.gz |
macOS 10.15+ |
| macOS Apple Silicon | ultralog-macos-arm64.tar.gz |
M1/M2/M3/M4 Macs |
| Linux x64 | ultralog-linux.tar.gz |
Most distributions |
Windows:
- Download and extract
ultralog-windows.zip - Run
ultralog-windows.exe - You may see a SmartScreen warning on first run - click "More info" → "Run anyway"
macOS:
- Download the appropriate
.tar.gzfor your Mac - Extract:
tar -xzf ultralog-macos-*.tar.gz - On first run, right-click the file and select "Open" to bypass Gatekeeper
- Or remove quarantine attribute:
xattr -d com.apple.quarantine ultralog-macos-*
Linux:
- Download and extract:
tar -xzf ultralog-linux.tar.gz - Run:
./ultralog-linux
Prerequisites:
- Rust (latest stable version)
- Platform-specific build tools (see below)
Linux Dependencies (Ubuntu/Debian):
sudo apt-get update
sudo apt-get install -y \
build-essential \
libxcb-render0-dev \
libxcb-shape0-dev \
libxcb-xfixes0-dev \
libxkbcommon-dev \
libssl-dev \
libgtk-3-dev \
libglib2.0-dev \
libatk1.0-dev \
libcairo2-dev \
libpango1.0-dev \
libgdk-pixbuf2.0-devmacOS Dependencies:
xcode-select --installWindows Dependencies:
- Install Visual Studio Build Tools
- Select "Desktop development with C++" workload
Build Steps:
# Clone the repository
git clone https://github.com/SomethingNew71/UltraLog.git
cd UltraLog
# Build release version (optimized)
cargo build --release
# The binary will be at:
# - Windows: target/release/ultralog.exe
# - macOS/Linux: target/release/ultralog-
Launch UltraLog - Double-click the application or run from terminal
-
Load a log file - Either:
- Click the "Select a file" button in the left sidebar
- Drag and drop a log file onto the window
-
Select channels - Click channel names in the right panel to add them to the chart (up to 10)
-
Navigate the data -
- Click anywhere on the chart to move the cursor
- Use the timeline scrubber at the bottom
- Use playback controls to animate through the data
-
Customize your view -
- Change units via the Units menu
- Enable Cursor Tracking to keep the cursor centered
- Enable Colorblind Mode for accessible colors
Supported file extensions: .csv, .log, .txt, .mlg
UltraLog automatically detects the ECU format based on file contents:
- Haltech: Identified by
%DataLog%header - ECUMaster: Identified by semicolon/tab-delimited CSV with
TIMEcolumn - RomRaider: Identified by comma-delimited CSV starting with
Timecolumn - Speeduino/rusEFI: Identified by
MLVLGbinary header
Loading multiple files:
- Each file opens in its own tab
- Switch between tabs by clicking them
- Close tabs with the × button
- The same file cannot be loaded twice
Selecting channels:
- Use the search box to filter channels by name
- Click a channel name to add it to the chart (turns blue when selected)
- Click again to remove it from the chart
- Up to 10 channels can be displayed simultaneously
Understanding the chart:
- All channels are normalized to 0-1 range for easy comparison
- The legend shows:
- Channel name with color indicator
- Min/Max values for the entire log
- Current value at cursor position with units
Zooming and panning:
- Scroll to zoom in/out on the time axis
- Click and drag to pan the view
- Double-click to reset zoom
Timeline controls (bottom of window):
- Play/Pause - Start or pause data playback
- Stop - Stop playback and return to beginning
- Speed selector - Choose playback speed (0.25x to 8x)
- Timeline scrubber - Drag to seek through the data
- Time input - Type a specific time in seconds
Cursor tracking: When enabled (View menu → Cursor Tracking), the chart automatically scrolls to keep the cursor centered as you scrub through data.
Access via Units menu. Changes apply immediately to all displayed values.
| Category | Options |
|---|---|
| Temperature | Kelvin, Celsius, Fahrenheit |
| Pressure | kPa, PSI, Bar |
| Speed | km/h, mph |
| Distance | km, miles |
| Fuel Economy | L/100km, MPG |
| Volume | Liters, Gallons |
| Flow Rate | L/min, GPM |
| Acceleration | m/s², g |
Note: Unit conversion is applied at display time only - original data is never modified.
Field normalization maps ECU-specific channel names to standardized names, making it easier to compare data across different ECU systems.
Enable/Disable: View menu → Field Normalization
Example mappings:
- "Act_AFR", "AFR1", "Aft" → "AFR"
- "MAP", "Boost_Press" → "Manifold Pressure"
- "RPM", "Engine_Speed" → "Engine RPM"
Custom mappings:
- Open View menu → Normalization Editor
- Add custom source → target mappings
- Changes apply immediately to channel names
PNG Export:
- File menu → Export → PNG
- Choose save location
- Current chart view is saved as a PNG image
PDF Export:
- File menu → Export → PDF
- Choose save location
- Chart is exported as a PDF document
The scatter plot tool visualizes the relationship between two channels.
To use:
- Click the tool switcher (top-right area) and select "Scatter Plot"
- Select X-axis channel from the dropdown
- Select Y-axis channel from the dropdown
- Data points are plotted showing correlation between the two channels
Use cases:
- Correlate AFR vs. manifold pressure
- Compare throttle position vs. engine load
- Identify tuning anomalies
Colorblind Mode:
- Enable via View menu → Colorblind Mode
- Uses Wong's optimized 8-color palette
- Designed to be distinguishable for deuteranopia, protanopia, and tritanopia
Standard color palette: Blue, Orange, Green, Red, Purple, Brown, Pink, Gray, Yellow, Cyan
Colorblind palette: Black, Orange, Sky Blue, Bluish Green, Yellow, Blue, Vermillion, Reddish Purple
| Action | Shortcut |
|---|---|
| Open file | Ctrl/Cmd + O |
| Close tab | Ctrl/Cmd + W |
| Export PNG | Ctrl/Cmd + E |
| Play/Pause | Space |
| Stop | Escape |
| Component | Technology |
|---|---|
| Language | Rust (Edition 2021) |
| GUI Framework | eframe / egui 0.29 |
| Charting | egui_plot 0.29 |
| File Dialogs | rfd 0.15 |
| Image Processing | image 0.25 |
| PDF Generation | printpdf 0.7 |
| Serialization | serde / serde_json 1.0 |
| Error Handling | thiserror 2.0 / anyhow 1.0 |
| Logging | tracing / tracing-subscriber 0.3 |
# Run in debug mode (faster compile, slower runtime)
cargo run
# Run in release mode (slower compile, faster runtime)
cargo run --release
# Run the parser test utility
cargo run --bin test_parser -- path/to/logfile.csv
# Run tests
cargo test
# Check code formatting
cargo fmt --all -- --check
# Run lints
cargo clippy -- -D warningsUltraLog/
├── src/
│ ├── main.rs # Application entry point
│ ├── app.rs # Main application state and logic
│ ├── state.rs # Core data types and structures
│ ├── units.rs # Unit conversion system
│ ├── normalize.rs # Field name normalization
│ ├── parsers/ # ECU format parsers
│ │ ├── haltech.rs # Haltech CSV parser
│ │ ├── ecumaster.rs # ECUMaster CSV parser
│ │ ├── romraider.rs # RomRaider CSV parser
│ │ └── speeduino.rs # Speeduino MLG parser
│ └── ui/ # User interface components
│ ├── sidebar.rs # File list and options
│ ├── channels.rs # Channel selection panel
│ ├── chart.rs # Main chart and LTTB algorithm
│ ├── timeline.rs # Playback controls
│ └── ...
├── assets/ # Icons and fonts
├── exampleLogs/ # Sample log files for testing
└── Cargo.toml # Project manifest
- Ensure the file is from a supported ECU system
- For ECUMaster, export to CSV from EMU Pro software (native
.emuprolognot supported) - Check that the file is not corrupted
- Right-click the application and select "Open"
- Go to System Preferences → Security & Privacy and allow the app
- If downloaded from the internet, you may need to remove the quarantine flag:
xattr -d com.apple.quarantine /path/to/ultralog
- UltraLog handles large files well, but extremely large files (100MB+) may need a moment to process
- Try closing other applications to free up memory
- Ensure you're running the release build, not debug
- Check your Unit Preferences in the Units menu
- Some ECU systems report data in specific units - UltraLog attempts to convert automatically but may need manual adjustment
- Open an issue on GitHub with a sample log file
- Include the ECU system name and software version used to export
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.
Cole Gentry
- GitHub: @SomethingNew71
- Website: Classic Mini DIY
- Classic Mini DIY - Classic Mini enthusiast website with tools, calculators, and resources
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- egui - The immediate mode GUI library that makes this possible
- Wong's colorblind-safe palette for accessibility research
- The automotive tuning community for feedback and feature requests