Changelog
romHEX14 release history and version notes
1.0.0-beta7
Sandboxed Lua scripting engine with consent-gated permissions, Catalog Tune Suggestions that mine your own tune library for consensus changes, local OLS catalog sync with exact twin detection, KP map pack import fixes, and smarter map auto-detection.
- Sandboxed Lua 5.4 engine with a WOLS-compatible scripting API
- Per-script consent dialog with SHA-256 identity — run once or trust persistently
- Code-execution paths (os.execute, io.popen, native libraries, dofile) blocked by the sandbox
- HTTP access gated per host — allow once or always, per script
- Engine runs on a dedicated worker thread — long scripts never freeze the UI
- Honest error reporting: every API call sets a readable error instead of silently returning false
- Scans your own tune catalog for files similar to the open ROM and groups them by intent
- Consensus-scored change suggestions with agreement labels (All agree / Strong / Majority / Disputed)
- Per-suggestion preview: contributing files, match %, delta at the densest cell
- Minimum-consensus slider and one-click apply of ticked suggestions
- One-time read-only copy of your OLS catalog into a local database — survives catalog format changes
- Exact twin detection (project + data area) via the decoded catalog identity
- MinHash inverted index with containment scoring for fast fuzzy similarity
- Per-version catalog rows so every tune revision is searchable
- Fixed addresses, dimensions and folder grouping when importing .kp map packs
- OLS parser restored to its proven state with KP folder grouping properly scoped
- Shape and cell-size priors tuned on a labelled map corpus — far fewer junk candidates
- Overlap suppression keeps only the best-scoring interpretation of each ROM region
- All beta7 features fully translated (EN, ES, TH, ZH)
- Batch translate: stall/timeout guard so long translation jobs never hang
1.0.0-beta6
Datalog viewer for VehiCAL & Autotuner formats, OLS schema 479 support with CJK map-name decoding, floating map overlay with map description in the title, robust handling of unsupported maps, and 150 fresh translations across all four languages.
- New top-level Datalog menu with Open Log… and Compare Logs…
- Native support for VehiCAL and Autotuner CSV formats
- TimeSeriesPlotWidget with trackpad scrolling, smooth zoom and pan
- Channel tree with aliases, unit normalization and ECU-family detection
- Pull detector for boost ramps and load events
- Recent logs submenu remembers your last 10 files
- Schema 479 (MED17.7+) support — all version-gated fields ported up to v596
- readAxis fix: missing field read and 2-byte tail advance restored
- X/Y axis assignment corrected (first axis on wire is the rows axis)
- Universal-base address translation for newer files that no longer use the legacy segment layout
- Map cell reads honor the per-map cellDataType and byte-order from the file
- CJK map-name decoding: GB18030, GBK, Shift_JIS, EUC-KR probed before cp1252
- 150 new translation strings across English, Spanish, Thai and Simplified Chinese
- Map overlay is now a floating tool window — it stays visible while you type in the search bar
- Map overlay title shows the map description (e.g. "KFMIOP — Kennfeld optimales Motormoment") instead of the project name
- Maps with implausible dimensions are rejected at parse time instead of crashing the display
- Cell read-out guards against out-of-range addresses and shows "<map> — not yet supported" rather than erroneous data
- Gitee release mirror — Chinese users can download from gitee.com/liuyanpeng14/romhex14-pro
1.0.0-beta5
8 color theme presets with live switching, OLS catalog import with similarity search, open cloud DTC architecture, constants centralization, crash handler, and dozens of UI refinements.
- 8 color theme presets: Midnight (default), Ocean Deep, Dark Forest, Volcanic, Arctic, Cyberpunk, Solarized Dark, Monokai
- Live theme switching from Settings — entire UI updates instantly
- Runtime Theme namespace replaces compile-time constants — all colors dynamic
- style.qss template engine with placeholder substitution
- Welcome page, left panel, menus, toolbars, status bar all respond to theme changes
- Settings dialog refreshes its own colors on theme selection
- New structural colors: top bar, toolbar, status bar, tree, buttons, inputs
- SQLite catalog reader — reads OLS tuning databases already on your machine
- Fingerprint-based similarity search across your ROM collection
- One-permutation MinHash with bottom-K sketch (~2 KB per file)
- Parallel catalog DB reads (29 SQLite files in ~1.5s)
- Process-wide cache shared across dialog instances
- Configurable cloud DTC/Features client — no hardcoded server URL
- Dormant by default — no traffic until user explicitly configures a server
- Open-source Flask reference server with token auth and rate limiting
- Engine interface for operators to plug in their own ROM analysis logic
- Centralized app constants (appconstants.h) with settings migration
- OlsImporter: extract real version names from revisionTag metadata
- DiffPanel: defer recompute when hidden, cap at 50K rows
- Subwindow close: deferred model mutation fixes intermittent SIGSEGV
- Windows crash handler with VEH stack traces in rx14.log
- Find Similar Files: parallel catalog reads, batched tooltip updates
- Settings menu entry fixed on macOS (was intercepted by app menu)
- All new strings translated for EN, ZH, ES, TH
- Theme names and UI labels fully internationalized
1.0.0-beta4
Community contributions merged: edit operations (slider, interpolate, smooth, flatten), annotations & markers, tuning branches, diff panel, find similar maps, bulk edit, 8 color theme presets, and complete i18n.
- Edit Operations — Value +/-1, change absolute/relative, slider edit with live preview, round/limit, interpolate, smooth, flatten, repeat (F4)
- Annotations & Markers — Attach comments and markers to ROM offsets (Shift+Enter / Ctrl+F5), persisted in sidecar JSON
- Tuning Branches — Named savepoints with instant switch, rename, delete (Ctrl+B)
- Diff Panel — Side-by-side byte comparison between two projects with alignment controls
- Differences vs Original — Overlay showing every cell that differs from the original ROM (Ctrl+Shift+O)
- Find Similar Maps — Histogram-based fingerprint engine to find maps with similar data patterns
- Bulk Edit — Multi-select maps in the project tree and apply operations across all at once
- Map List Export — Export map list as CSV or JSON with full metadata
- Manual Map Creation — Right-click hex selection to create map directly
- Theme Presets — 8 color themes: Midnight, Ocean, Forest, Volcanic, Arctic, Cyberpunk, Solarized, Monokai
- Community Update Checker — Automatic notification when a new version is available
- Real ECU Auto-detect implementation (73 detector families)
- Real Map Auto-detect implementation (pattern-based scanner)
- OLS magic signature fix for reliable .ols/.kp import
- Complete i18n for all new features (EN, ZH, ES, TH)
- Build hardening with -ffile-prefix-map
- Contributors section in About dialog
- Fixed hex view right-click clearing selection
- Fixed diff overlay not tracking external edits
- Fixed Qt::UniqueConnection + lambda crash
1.0.0-beta3
OLS round-trip, KP map-pack import done right, Cmd+K command palette, fixed all-ROMs-detect-as-MED17, .mpc format support, and a fluid welcome page.
- OLS round-trip — byte-faithful .ols import + export with full sentinel and preamble passthrough
- KP map pack import — KP files now merge maps into the active project (mirrors A2L flow) instead of opening a new project; intern parser ported from parse_kp.py with comment-prefixed records and dimension heuristic
- Cmd+K command palette — instant fuzzy search across open projects, maps, settings, and every menu action
- Welcome page v3 — fluid 1–10 column adaptive grid, brand-logo fronted recent projects, quick-action tiles, recent maps strip, dismissible empty-state hint
- .mpc ROM format support — recognized in every ROM picker (welcome drop zone, New Project, Open ROM, Auto-detect ECU, Patch Editor, ROM Link)
- Fixed every ROM detecting as MED17 — the FADECAFE + CAFEAFFE sentinel pair is present in most modern Bosch ROMs and was over-matching; auto-detect now re-runs the family extractor when the initial result is generic
- extractIdBlock thresholds loosened (window 96 → 160, printable 60 → 20) so any P010-prefixed slab is accepted
- ROMs now correctly resolve to specific families (EDC17C64, MEVD17.x, EDC17CP14, MED17.5.x, …) instead of the generic MED17/MEDC17 catch-all
- VSCode-style autosave preference — pick off / after delay / on focus change / on window deactivate, persisted per workspace
- OLS-imported projects auto-suggest filenames as OLS_brand_model_ecu.rx14proj so disk listings stay tidy
- Empty-state card on the project view is dismissible per project (× button) and the dismissal persists in the project file
- Auto-detected map list is collapsible / hideable per project — keep the sidebar focused on user-curated maps
- Update download failure now shows a popup explaining GFW issues with a one-click "Open in browser" fallback to the GitHub release
- Manage account link goes to /login.php (was a broken /account URL)
- Consolidated duplicate Import OLS menu items into a single entry
- QSS: removed the inflating QToolButton / QPushButton min-sizes that were making toolbar buttons 60–80 px wide; bumped disabled-text contrast to WCAG AA (4.97:1)
- Single-call onMapActivated path — fixes the brief overlay flash where maps briefly opened then closed when clicking sidebar entries
- BLK_AMAP block in the rx14proj container preserves auto-detected maps across save / load without re-running the scanner
- Project::open peek check uses byte-by-byte little-endian magic instead of first-byte sniffing — no more false positives on files starting with "R"
- i18n architecture: tr() text separated from URL / HTML wrappers so URL changes no longer invalidate translations
- All four language files at 100% — 1516 / 1516 finished entries in en, es, th, zh
- New strings for autosave modes, command palette, KP / OLS import flows, ECU auto-detect, .mpc support, and update-failure popup all translated
- KP import: parser now returns the correct map count (was returning 0 for all KP files because it was using the OLS Kennfeld wire format instead of KP's comment-prefixed layout)
- KP import: no longer creates a spurious new project — maps are merged into the active project with name + address dedupe
- ECU auto-detect: ROMs no longer all show as MED17
- Map overlay: no longer briefly opens then closes when clicking a map in the sidebar
- Manage account link: now reaches a real URL and the "Manage account" string is still translated when the URL changes
- OLS export: HEX-imported projects are honestly refused with a clear message pointing to Save Project / Export ROM, instead of producing broken .ols files
- Project naming: spaces stripped from auto-suggested OLS project filenames
1.0.0-beta2
A complete UX overhaul. New welcome page, no-A2L Hex Comparison, AI Assistant rebuilt, full online docs, and 100% translated UI in four languages.
- Welcome page v2 — premium hero with split-style "Calibrate smarter." tagline, three colored action cards (Open / New / Import) with hover lift, recent projects with rich metadata + auto-fetched brand logos, account ribbon for signed-in users, "What's New" + "Documentation" cards, and a quick Project Manager shortcut
- Hex Comparison — pure byte-level diff that needs no A2L. Pick any two byte sources across every open project (Original, Current, Factory ROM, linked ROMs, version snapshots) grouped by project, navigate via a red density waveform, jump through diffs from a virtualized list, and scroll-track everything live
- AI Assistant rebuild — proper Markdown rendering via QTextBrowser (lists, links, code blocks, tables now work), token + cost chip in the input row, per-message Copy + Regenerate buttons, and per-project conversation persistence across sessions
- Documentation site — 19 sections × 4 languages live at romhex14.com/docs, accessible from the Help button + Documentation card with the app's current locale auto-applied
- Welcome page now opens straight to the app — the multi-slide intro wizard is gone
- Account ribbon shows email, plan / module count, and a "Manage account" link with hover-glow accent border
- Recent projects rows show brand logo (auto-fetched from the open-source car-logos dataset), brand · model · ECU · customer, and relative time ("2 days ago")
- Project name display is now file-first: filename + "(Brand Model · ECU · year)" — no more confusion when two projects share a brand
- Login dialog redesigned to match the About dialog tone — single primary blue sign-in, header strip, sunken inputs, success / module pills
- Universal "Risky Change" confirmation — DTC, Patch Editor, Map Pack, and AI Functions all share the same confirm dialog with diff preview, snapshot-by-default, typed-confirmation gate for large operations, and per-row before / after table
- Cancellable progress dialogs for long apply operations — chunked, modal, with full rollback on cancel
- Snapshot before every destructive action by default (DTC, Patch, Map Pack, AI Functions, AI inline writes) so reverting is one click
- Help and Preferences buttons in the welcome top bar now actually do something
- Every dialog is resizable, with last size persisted in QSettings (About, Config, Hex Compare, KP Import, Project Properties, Map Properties, ROM Link, ROM Compare, Checksum Select, Create Map, Project Manager, New Project, A2L Import)
- Removed the 120-line animated robot in AI Functions in favor of the unified confirm dialog
- Hex Comparison waveform — bright red gradient density bars with translucent ambient wash so even single-byte changes in a 4 MB ROM are visible at a glance
- Per-row red marker stripe in the diff view so you can scan-scroll for changes
- Diff list panel with virtualized rendering — handles hundreds of thousands of diff runs without lag
- Cross-widget sync: click waveform → byte view jumps; click list row → byte view jumps; scroll byte view → waveform marker tracks
- Hex view bytes-per-row now adapts to viewport width (4 / 8 / 16 / 32 cols) so panes never overlap
- ByteDiffWidget paint pipeline rewritten — pre-built lookup tables for hex + ASCII glyphs, stack-buffer snprintf for addresses, two-pass rendering with grouped pen color changes
- RomCompare::diffBytesSummary + diffRuns — 8-byte word-stride scan with no per-byte QVector allocation; orders of magnitude faster on multi-MB ROMs
- Signal-driven autosave — switched from a 3-minute periodic timer to a 1.5-second debounced trigger fired by Project::dataChanged / versionsChanged / linkedRomsChanged
- Welcome page recent-project logos load from disk cache after first launch — no network round-trip
- Linked ROMs and version snapshots actually persist now (the underlying serialization was correct; the modified flag was the bug)
- All four language files at 100% translated — 1315 / 1315 finished entries in en, es, th, zh
- Live retranslation — switch language at runtime and the welcome page, status bar, update banner, and confirmation dialogs all rebuild in the new locale immediately
- Documentation site auto-discovers translations per section and shows a friendly "not yet translated — showing English" notice when a translation is missing
- Help + Documentation buttons in the welcome page pass the desktop locale to the docs site so the right language opens automatically
- Single source-of-truth version system — root /VERSION file is read by CMake, propagated via configure_file → version.h, and consumed by both the app and the installer; bump one file, everything else updates
- Design system module (uiwidgets.h / .cpp) — Theme tokens (palette, type scale, radii, spacing) + UI helpers (cards, header strips, primary / destructive / flat buttons, pills, form fields) so dialogs share one source of styling truth
- BrandLogo service — async fetch with three-tier cache (memory → disk → network), curated brand → slug map for ~70 manufacturers, falls back to a colored letter chip on miss
- Versions, linked ROMs, and modified flag are now correctly set across all mutation paths (Project::snapshotVersion, actLinkRom, actImportLinkedVersion)
- Hex Comparison: ASCII column of the left pane no longer overlaps the address column of the right pane on narrow widths
- Welcome page: brand logos appear (the previous Clearbit-based source was discontinued; switched to an open-source GitHub-hosted dataset)
- Status bar "Ready" message + "Update available" banner now retranslate on language switch
1.0.0-beta1
Maintenance release. Update-checker comparison fix, version bumped to beta, installer + release-script tightened.
- Update checker — alpha3 vs alpha4 comparison now compares the trailing version number correctly
- Version updated to 1.0.0-beta1
- Release script now stages the ChecksumDLL folder with all runtime dependencies
- Installer version synced with app version
1.0.0-alpha3
OLS parser, DTC manager, AI functions, vehicle DB, full i18n
- OLS file import — universal ROM extraction, scaling, byte order detection
- DTC Manager: view, search and disable diagnostic trouble codes for Bosch ECUs
- AI Functions: one-click Decat, DPF, EGR, AdBlue, Swirl, Speed Limiter, Start-Stop
- AI map explain button in overlay with streaming Claude response
- Vehicle database: 7,300+ models, 954 ECUs, cascading brand / model / engine selector
- 3D Sim: slice planes, glowing intersections, mini heatmap, depth improvements
- OLS ROM position via "Original" marker (verified with frida traces)
- OLS map scaling factors + axis scaling from binary record fields
- Display precision derived from scaling factor (matches OLS standard)
- Claude API URL now editable for custom endpoints
- JWT auto-refresh on startup + 402 auto-retry for seamless module provisioning
- Export ROM with version selector
- Enter key sends message in AI assistant — Shift+Enter for newline
- Intro wizard shown only on first launch
- HiDPI icon rendering for Apple Silicon (devicePixelRatio)
- Installer: license agreement with acceptance checkbox, uninstaller support
- AI assistant: ROM/version selector, better suggestion chips, visible API Key button
- AI settings page in app preferences
- Full i18n — 800+ translated strings in Chinese, Spanish and Thai
- Server: signature path fix, translation cache fuzzy matching, zh_CN normalization
- Universal map name detection via 0x0A marker pattern
- ROM size auto-detection from address patterns
- ROM position from "Original" version block field
- Byte order detection from "Hexdump" header field
- Map type classification (VALUE / CURVE / MAP) from record type field
- Dimension detection with multi-strategy search
- Axis address inference (stored before map data in ROM)
- Header parsing with compound blob support
- Fixed crash on large A2L files (74 MB+) — replaced regex with indexOf
- 64 MB thread stack for parser thread
- A2L–ROM compatibility scoring (EPK, axis headers, smoothness)
- Import results dialog with detailed stats
- Base address auto-detection for Continental / Simos ECUs
- Fixed base address override bug (BIN parser was overriding A2L detection)
- Fuzzy subsequence matching in left panel filter
- Separator-agnostic search (underscores, dots, dashes stripped)
- Relevance-scored results sorted by match quality
- Click-drag range selection with blue overlay
- Right-click context menu (Selection→Map, Value±1, Copy, Zoom)
- Auto-scroll when dragging near edges
- Create Map dialog from waveform selection
- Single-instance lock (QSharedMemory)
- showROM() called in loadProject — fixes blank 2D view on reopen
- Large project optimizations for projects with 5,000+ maps
1.0.0-alpha2
OLS import beta, fuzzy search, 2D selection, A2L crash fixes
- Universal map name detection via 0x0A marker pattern
- ROM size auto-detection from address patterns
- ROM position from "Original" version block field
- Byte order detection from "Hexdump" header field
- Map type classification (VALUE / CURVE / MAP) from record type field
- Dimension detection with multi-strategy search
- Axis address inference (stored before map data in ROM)
- Header parsing with compound blob support
- Fixed crash on large A2L files (74 MB+) — replaced regex with indexOf
- 64 MB thread stack for parser thread
- A2L–ROM compatibility scoring (EPK, axis headers, smoothness)
- Import results dialog with detailed stats
- Base address auto-detection for Continental / Simos ECUs
- Fixed base address override bug (BIN parser was overriding A2L detection)
- Fuzzy subsequence matching in left panel filter
- Separator-agnostic search (underscores, dots, dashes stripped)
- Relevance-scored results sorted by match quality
- Click-drag range selection with blue overlay
- Right-click context menu (Selection→Map, Value±1, Copy, Zoom)
- Auto-scroll when dragging near edges
- Create Map dialog from waveform selection
- Single-instance lock (QSharedMemory)
- showROM() called in loadProject — fixes blank 2D view on reopen
- Large project optimizations for projects with 5,000+ maps
1.0.0-alpha1
Initial alpha release
- A2L / ASAP2 parser with full COMPU_METHOD, axis and record layout support
- Interactive 2D table and 3D surface map viewer
- Real-time editing with diff comparison
- Binary compare — byte-level diff with map-aware highlighting
- Checksum correction for Bosch, Siemens and Denso ECUs
- Export to binary, Intel HEX and Motorola S-record
- AI assistant powered by Claude
- Multi-language UI — English, Thai, Chinese, Spanish
- Windows, macOS and Linux support