Changelog
CobbVision — every release, what changed, and why.
Current version
v1.94.2
Fix Smart Engine online-flap: an engine heartbeating near the 120s window edge would flap online↔offline every sweep. The control plane now SERVES the heartbeat cadence (heartbeat_interval_seconds=60) in the engine config so both sides agree instead of the engine guessing, and the offline window is held at 3× that cadence (STALE_SECONDS 120→180) so an engine can miss up to ~2 beats (network blip / a long job pausing the loop) without being swept offline. Invariant unit-tested (window ≥ 2× cadence). Server-side; no migration. Prior label retained below. — Engine results in the audit log: the legacy CSV-result engine path (POST /api/v1/engine/result) now writes an engine.result audit entry the same way the structured ingest path writes engine.ingest, so every form of SmartEngine processing is visible in the admin Audit Log (cyan engine badge, link to the resulting analysis). Additive; no migration. Prior label retained below. — Upload bundle in the audit log (links to every processed file): a Smart Upload submits all its files together (datalogs, GPS, presets, photos, video) — now the whole upload is recorded as ONE upload.bundle audit entry, grouped by the batch id, with the per-kind counts and a clickable link to each resulting processed file (analysis page for datalogs, the GPS/photo/preset views for the rest). The admin Audit Log renders those links inline. Purely additive + guarded (best-effort, never blocks the upload); no migration. Prior label retained below. — Trip photos as a player layer (image proximity): geotagged photos attached to a session's trip now appear in the datalog player — dropped as clickable camera pins on the map, and as the car marker passes within a radius (default 25m, adjustable; auto-popup toggle) of where a photo was taken, the photo auto-pops as a dismissible overlay layer. The player() controller loads the trip's ready photos with GPS coords (media.trip_id, type=photo); player.php exposes window.CV_PLAYER (map + active marker) + CV_TRIP_IMAGES; a separate, syntax-validated trip-image-layer.js asset does the pins + proximity popup as a READ-ONLY observer that never touches the playback loop (so it can never break the player). Guarded for installs without the media table. Prior label retained below. — Webhooks: surface the last delivery error. A failing webhook now explains itself at a glance — the Account → Webhooks page shows the most recent delivery's error (TLS/connection/non-2xx) under each hook when its last attempt did not succeed, via a last_error/last_success annotation added to listForUser. Failed deliveries are also error_log'd so a server-log tail surfaces them. Diagnostic only; the delivery machinery is unchanged. Prior label retained below. — Multi-source GPS reconciliation — pick a trip's source of truth: a trip can carry several GPS sources of differing trust (the first-party phone app, a dedicated GPS file, GPS extracted from GoPro/Insta360 video, or an AP-speed-derived track). Migration v1.82 adds gps_tracks.source_type + source_priority (lower = more authoritative) + is_primary. New GpsSourceReconciler elects the primary by a ladder (phone app › GPS file › video › AP-derived; ties → most points → newest), and the Trip page lists every GPS source with its type/points and a "Make source of truth" override. The /api/v1/gps-track upload now tags source_type (the iOS app sends device_app, which auto-wins) + its priority and re-elects the trip primary. Pure ladder/election logic (priorityFor/inferSourceType/pickPrimaryId) is unit-tested. Additive + guarded — the existing trip path/correlation display is untouched; wiring the primary to DRIVE the displayed path is the next step. Prior label retained below. — Desktop Smart Engine module (server-half): a Smart Engine can now run as a downloadable Desktop module, not just a Docker container. Migration v1.81 adds user_engines.kind (docker|desktop, default docker for back-compat) + user_engines.hostname (self-reported computer name). The register/heartbeat endpoints accept and persist kind+hostname via persistEngineRuntime (kind whitelisted to docker|desktop), publicEngine surfaces them, and the Account → Smart Engine list shows a Docker/Desktop badge + @hostname so you can tell your machines apart. Same auth + encrypted-result path for both kinds — the desktop module gets an engine key, never a DB credential. Prior label retained below. — Security: webhook SSRF guard. Webhook delivery POSTs to a user-supplied URL; validateUrl previously allowed HTTPS to ANY host, so a user could register a webhook at a private/internal address (10/8, 172.16/12, 192.168/16, 127/8 loopback, 169.254.169.254 metadata, IPv6 ::1/fe80::) and use the server as an SSRF probe. validateUrl now resolves the host and rejects any target that maps to a private/loopback/link-local/reserved IP (the explicit localhost dev affordance is exempt; unresolvable hosts are rejected). New pure WebhookService::isPublicIp seam is unit-tested. Prior label retained below. — Mobile: global overflow safety net (stop formatting going off iPhone screens). Long unbreakable identifiers (engine UIDs, API keys, VINs, hashes, URLs, file paths) now wrap instead of stretching their column; media + tables are capped to the viewport; bare tables (not using .table/.table-scroll) scroll instead of widening; and any stray horizontal overflow is clipped at ≤980px. Pre-formatted command blocks keep their own overflow-x:auto so they still scroll rather than wrap. Prior label retained below. — Webhooks: wire the 5 events that never fired. Five catalog events were subscribable in the UI but had NO dispatch() call site, so they silently never posted: engine.online / engine.offline (now fired from EngineControlPlane::registerOrHeartbeat on a real offline→online transition + new registration, and from setOffline + the stale-engine sweep), engine.job_completed (EngineController::result AND the new ingest), trip.completed (RouteJob::finishRoute), and subscription.updated (PaymentController on renew + status change). The delivery machinery (HMAC signing, retries, TLS, webhook_deliveries logging) was already correct — this was purely missing call sites. vin.locked / vin.mismatch were already wired (the stale doc comment wrongly listed them as TODO; corrected). Engine events fire only on real transitions, never per-heartbeat. Prior label retained below. — Smart Engine direct ingest (server is the sole DB writer; engine holds no DB credential): NEW POST /api/v1/engine/ingest lets a Smart Engine submit its ALREADY-PARSED result — typed datalog rows + extracted GPS + AP-info — so shared hosting inserts directly instead of decompressing + re-parsing a CSV. SECURITY MODEL: the engine never holds a database credential and never connects to MySQL (the DB is shared/multi-tenant, MySQL has no row-level security, and the engine — especially the coming Desktop module — runs on hardware we don't control). The decrypted payload is DATA only; the server (the sole DB writer) derives ownership itself (session must belong to the token user AND be assigned to THAT engine), whitelists columns to a fixed schema, coerces/validates values, rejects oversized payloads, and re-runs analysis SERVER-SIDE so client-computed verdicts are never trusted. Naturally idempotent (rows/anomalies/gps replaced). DatalogController::ingestEngineResult reuses the exact insert columns + AnalysisEngine + VIN-lock + fingerprint + tune + render + webhooks as processSession; EngineController::ingest does chunked-CVRS reassembly + decrypt + inflate + validate (validateIngestPayload, unit-tested) + ownership + audit (engine.ingest in both engine_audit_log and audit_log, with a link to the analysis). The legacy compressed-CSV path (POST /api/v1/engine/result) keeps working for older engines. Prior label retained below. — AP-Connect: bound the last unbounded fetches (no more connect/upload hang): the WebUSB device reads were already time-bounded, but two NETWORK calls were not — the VIN-first vehicle-prepare POST (runs on connect, before logs load) and the preset-batch upload POST. A server that accepted the connection but never responded left either pending forever, freezing the flow at "Reading device info…" or "Uploading presets…". A shared fetchWithTimeout (AbortController + timer) now bounds EVERY connect-ap network call — vehicle prepare (30s), datalog upload + preset upload (120s) — so a hung/slow server fails fast and the batch always advances. READER_VERSION bumped (asset() mtime cache-bust ensures the browser gets the new JS). Prior label retained below. — Downloads pages: install/use walkthroughs + accurate Docker deploy guide: The Smart Engine download page now carries a full deploy guide (pull, CPU + GPU runs, env-var reference, docker-compose, verify, update, troubleshoot) and the Desktop page an install + first-use walkthrough. Corrected the engine run instructions to match the shipped container: it authenticates with CV_KEY ALONE (no CV_USERNAME / CV_ENGINE_KEY), image grioghar/cobbvision-smartengine:0.4.0 (not a ghcr :latest), volumes cv_temp + cv_cache, host port 8443->6088 — the old copy-paste would have failed. docs/help/smart-engine.md mirrors the deploy guide. Prior label retained below. — Parser also inflates zlib/deflate (defense-in-depth + recovers pre-fix engine results): DatalogParser already transparently gunzips .csv.gz; it now also inflates zlib (RFC 1950, the engine compress2 format) and raw DEFLATE, header-sniffed. This makes the parser robust to ANY compressed log handed to it AND recovers datalog sessions whose storage was overwritten with the engine's zlib result before the v1.89.2 server-side inflate — a plain reprocess now inflates the stored blob back to real rows (no re-upload). Prior label retained below. — Engine offload result inflate fix (empty "Health 100%" analysis): The Smart Engine zlib-compresses (compress2) the normalized CSV before CVRS-encrypting it, but the server wrote the DECRYPTED-yet-still-COMPRESSED bytes straight to the session storage — so the worker parsed a zlib blob, inserted 0 rows, and the log finalised as a dataless "Health 100%". EngineController::result now inflates the decrypted payload (zlib/gzip/raw-deflate, header-sniffed, 256 MB bomb cap) back to plain CSV before the authoritative pipeline runs. Scoped to the engine path; the native encrypted-upload path does not compress. Prior label retained below. — Engine offload result decrypt fix (OAEP-SHA256) + multi-platform parser + processing-page UX: The Smart Engine offload now completes end-to-end. Its encrypted result is RSA-OAEP wrapped with SHA-256 (as every native client does), but the server decrypted with PHP openssl_private_decrypt, which only does SHA-1 OAEP — so every result was rejected (HTTP 422) and the engine re-claimed the job forever. New CobbVision\Services\RsaOaep (RFC 8017 RSAES-OAEP, SHA-256 + MGF1-SHA256, over raw RSA) is wired into BOTH server decrypt paths — EngineEnvelope::openResult AND ApiController::decryptBundle — so engine offload AND native encrypted upload both work (verified: a 9.4 MB log finalises in ~4s post-offload vs ~210s on DreamHost). DatalogParser gained verified per-make column aliases (Subaru EJ/FA + VW/Audi MQB EA888 Gen3) behind a case/whitespace-tolerant canonicalizer; unverified makes (Mazdaspeed, Ford EcoBoost, GT-R, Porsche, BMW) are left as commented TODOs (no fabricated headers). The Smart Upload processing page no longer shows a false "Failed" for a log that is merely still queued/processing — it shows a calm "still processing, check History" and keeps polling. Prior label retained below. — Webhooks + Smart Engine mesh/DNS/audit + collapsible nav + VIN-lock + download landings + worker self-heal: Outbound WEBHOOKS — users register endpoints and tick which events each receives (analysis.completed/failed, anomaly.critical, datalog.uploaded, trip.created/completed, engine.online/offline/job_completed, vin.locked/mismatch, subscription.updated); deliveries are HMAC-SHA256 signed (X-CV-Signature), logged to webhook_deliveries, manageable from the account page + an admin oversight page + JSON API. SMART ENGINE control plane is now fully control-plane-served: bootstrap/heartbeat hand the engine its ENTIRE runtime config (listen_port, log_level, TLS, DNS, mesh peers, ap_connect) so NOTHING resides on the container; per-engine configurable PORT + four LOG LEVELS (error/warn/info/debug) set on the control plane; engines ANNOUNCE activity to POST /api/v1/engine/audit, recorded into engine_audit_log at/above the engine threshold and surfaced as a per-engine audit log (jobs done + types). Each engine registers DNS as <hostname>.<username>.<apex> via the DreamHost DNS API (public A record), polled every ~10 min until it resolves; traffic is routed internal-first when the user shares the engine's WAN (failover to the public hostname). User-supplied or Let's-Encrypt TLS certs can be pushed from the control plane (engine_certs). Smart Upload, when you have an online engine, offers to upload DIRECTLY from that engine (least-loaded, internal/external URL). NAV reworked into a collapsible, 3-level, scrollable sidebar with the user block pinned bottom-left. Every download now has a LANDING page (/downloads hub + per-component). A top-of-page PROCESSING BANNER shows live Smart Engine/Smart Upload progress (how many of what, done, left, elapsed). VIN-LOCK: the first time an AccessPort's logs are processed, its identity is locked to the vehicle VIN (anti-frogging); later mismatches are flagged. WORKER self-heal: the pending-datalog drain is wall-clock-budgeted, per-session timeout-wrapped, and dead-letters crashed/OOM sessions so one bad log can no longer block the queue. Migration v1.80 adds webhooks, webhook_deliveries, engine_audit_log, engine_certs, ap_vin_locks and the user_engines DNS/port/log/tls/config/jobs_done columns. Prior label retained below. — AP-connect download-all no longer hangs + key-only engine bootstrap + robust .gz ingest: The WebUSB "Upload all logs" flow on /connect-ap could hang forever on "Downloading <name>…" because a stalled AccessPort read (WebUSB transferIn never rejects when the device simply stops sending) left the promise pending. Every device read and every upload fetch is now time-bounded (withTimeout race + AbortController), so one stuck or failed file is skipped + reported and the batch always advances; the summary lists which files were skipped. Gzipped AP logs (.csv.gz) are decompressed SERVER-SIDE, streamed in 1 MB chunks with a 256 MB decompressed cap (gzip-bomb guard); detection is by GZIP MAGIC BYTES (1f 8b), not extension, so a gzipped file named .csv is still inflated, across the AP-connect ingest, the per-vehicle upload, and the universal Smart Upload dispatcher. Smart Engine bootstrap (/api/v1/engine/bootstrap) now authenticates by the engine KEY ALONE — no username: the server looks the user up via a new indexed users.engine_key_lookup (SHA-256 hex of the key, populated on mint/rotate) then verifies against the bcrypt engine_key_hash (defense in depth). A username is accepted but ignored for back-compat. Migration v1.79 adds users.engine_key_lookup (VARCHAR(64) UNIQUE). Existing engine keys must be re-minted once (the old plaintext is unrecoverable) to populate the lookup. Original pretty-URL / Smart Engine label retained below. — Human-readable URL hierarchy (pretty URLs): pages now live at /{username}/{vehicle-slug}/{category}/{rest} — e.g. /jdoe/bugeye-wrx, /jdoe/bugeye-wrx/datalogs/{session}, /jdoe/bugeye-wrx/trips/{trip}, /jdoe/bugeye-wrx/player/{session}. This is a COSMETIC routing layer over the existing controllers: every legacy URL keeps working unchanged. A new users.username (v1.78; unique, ^[a-z0-9][a-z0-9-]{1,38}$, editable on the Account page) is the first path segment; existing users get an auto-generated, de-duped handle on migrate. A username can never shadow a real top-level route — UsernameService maintains a RESERVED blocklist derived programmatically from every first path segment in routes.php. The pretty hierarchy is registered as the router's LAST, low-priority catch-all (Router::fallback): all explicit routes win first, so the resolver only sees requests nothing else claimed. PrettyUrlController resolves {username}->user and {vehicle}->that user's slug, then enforces the SAME ownership/visibility as the legacy routes (owner/admin see all; a public vehicle's overview mirrors /v/{slug}; otherwise 404 — another user's private vehicle is never leaked). GET-only: it never intercepts POST actions, /api/*, webhooks, or /cron. Canonical links: a new canonicalUrl($vehicle,$category,$rest) helper generates the pretty links on the vehicle page, dashboard cards, datalog/trip/player links, and each restructured page emits <link rel=canonical>. Original Smart Engine v1.77 label retained below. — Smart Engine control plane + job offload: a user can run one or more cobbvision-smartengine Docker containers and the site now offloads heavy datalog processing to them. The engine is zero-config except CV_USERNAME + a per-user ENGINE KEY (a 64-hex secret distinct from api_key, stored only as a password_hash on users.engine_key_hash). It POSTs /api/v1/engine/bootstrap and gets its whole runtime config — including the user's BYO AI key — back as an app-layer-encrypted CVRS envelope (AES-256-GCM; the 32-byte key derived on both sides from the engine key via HKDF-SHA256, key_len=0) layered on top of TLS, so a TLS-terminating MITM sees only an opaque blob. Engines register/heartbeat into user_engines (capabilities {gpu,ollama,cpu_cores}, status, active_jobs); a stale engine (no heartbeat >120s) is swept offline by the cron tick AND the process-pending worker, and its in-flight work is reclaimed back to DreamHost. Smart Upload + reprocess route a session to the user's least-active online engine (balanced; round-robin on ties; status=engine_queued + assigned_engine_id), showing "your Smart Engine is processing this — it may take a moment". With NO online engine, behaviour is unchanged (DreamHost). The engine claims its session via /api/v1/engine/claim (raw CSV), processes, and pushes an encrypted result package back via the CHUNKED /api/v1/engine/result (CVRS, RSA-OAEP-wrapped AES key to the SITE public key) which the server decrypts, writes back, and re-queues for authoritative finalisation. Account page lists connected engines (status/capabilities/last heartbeat) and lets a user mint/rotate the engine key and revoke an engine. Migration v1.77 adds users.engine_key_hash, the user_engines table, compute_jobs.assigned_engine_id + datalog_sessions.assigned_engine_id (FK fk_compute_jobs_engine / fk_datalog_sessions_engine), and the datalog_sessions.status engine_queued value. · DB 1.82
v1.70.1
WebUSB: clean vehicle ID + server-side gunzip
Latest
2026-06-05
Fixed
- “Connect AccessPort” showed a garbled Vehicle ID. The device’s marriage reply is a binary record, and the generic string scanner grabbed a junk field instead of the real id. It now reads the clean married-vehicle id (e.g.
SUBA_US_WRXM_13), falls back to the human vehicle name (e.g. “2013 USDM Impreza WRX MT”), and shows both — never mojibake. - “Gzip decompression is unavailable in this browser” when pulling a log. The browser no longer depends on built-in gzip support: it uploads the raw
.csv.gzstraight to CobbVision, which decompresses it server-side before analysis (a fast in-browser path is still used when available). Works in every supported browser, and the anti-fraud device check still applies.
v1.70.0
Download Repointed to the CobbVision Installer
2026-06-05
Changed
- The Download page now points at the new CobbVision installer. Instead of a standalone sync client, you download one installer and pick which modules to install: AP Manager (reads your AccessPort datalogs & device info) and Media Manager (auto-uploads drive video, photos & GPS). Each platform's installer is resolved from the newest release that actually contains it, with a cached, graceful fallback.
- When no installer release has been published yet, the page shows a friendly “installer coming soon” state instead of dead download links.
Fixed
- The “Sync API Docs” CI workflow was failing on every push. The self-hosted runner couldn't clean root-owned files left by the containerized test jobs; it now reclaims the workspace before checkout (same fix the deploy workflow uses).
v1.69.0
Connect AccessPort in the Browser (WebUSB)
2026-06-05
Added
- Connect your AccessPort straight from the browser — no app to install. A new Connect AccessPort page talks to your Cobb AccessPort directly over WebUSB in Chrome/Edge: it connects, reads the device info (firmware, model, serial, married vehicle), lists the datalogs on the device, lets you pick one, pulls it, decompresses it in the browser, and uploads the CSV for analysis — handled exactly like a manually-uploaded log.
- New “Connect AccessPort” dashboard card linking to the page.
Notes
- WebUSB is Chromium-only (Chrome, Edge, Brave, Opera) and needs HTTPS. On Safari/Firefox the page detects the missing support and points you to the desktop app instead — those browsers are never broken.
v1.68.0
Device Fingerprint Association + Anti-Frogging
2026-06-05
Added
- Your free analysis is now tied to your physical Accessport, not just your account. Every Cobb datalog carries a hard-to-fake device identity (AP serial / ECU id / VIN) in its
AP Infocolumn. Once a device has used its one free analysis, spinning up a second throwaway account no longer unlocks another free run. Paying and subscribed users are unaffected. - Every Accessport is now linked to both you and your car — serial, ECU marriage id, VIN, and firmware are tracked per device.
- Admin “Device Fraud” view — a read-only panel surfacing devices reused across multiple accounts, with a soft fraud score (it flags for review, never blocks).
v1.67.0
Mobile-Friendly: Hamburger Nav + Responsive Layouts
2026-06-05
Added
- The whole site is now mobile-friendly. On phones & tablets the sidebar collapses into a hamburger menu that slides in from the left (dimmed backdrop, Esc to close, auto-closes when you tap a link), with a compact top bar showing the CobbVision logo.
- Charts now fluidly resize to fit the screen, so they never overflow on a phone.
Changed
- Responsive layouts everywhere. Dashboard cards, vehicle lists, analysis sections and account/admin forms reflow to a single column on small screens; wide tables scroll sideways instead of forcing the page wide; tab bars scroll horizontally.
- Bigger touch targets for buttons, inputs and selects on mobile (inputs use a 16px font so iOS doesn't zoom on focus).
- The datalog player works on mobile — top bar & transport controls scroll in a single row (keeping the map tall), larger play/scrub targets, the OEM cluster & H-pattern shifter scale down, and the Gauges / Drive Summary panels open as full-width sheets.
v1.66.0
Media Foundation — Photos, Chunked Video, Gallery, Trip-from-Photos
2026-06-05
Added
- Media gallery — your photos and video, uploaded from the CobbVision desktop app, now appear in a new Media page pinned to a map of where each one was captured (Leaflet, dark theme).
- Build a trip from photos — pick a start photo, an end photo, and any in-between shots, and CobbVision assembles a trip ordered by capture time, then lets you match a datalog to score the drive.
- Lightweight video playback — videos upload as ordered ≤20 MB chunks, reassemble server-side, and stream in a minimal HTML5 player (no transcoding — friendly to shared hosting).
- GPS “within 1%” combine — when a newly uploaded GPS track overlaps an existing one within ~1% (bounds + shape), they're grouped into the same trip automatically.
- New media ingest API for the desktop app:
POST /api/v1/media/photo,/media/video,/media/video/{id}/chunk,/media/video/{id}/complete(API-key auth).
v1.65.0
Logged Gear + Neutral, Gear Badge, Download Fix
2026-06-04
Changed
- Gear now comes straight from the logged ECU gear channel instead of being estimated. Neutral shows as N on the shifter and gears read 1–5 correctly (no off-by-one or phantom top gear).
- The moving car on the map now shows its current gear next to the speed (e.g.
3 · 45 mph, orNin neutral).
Fixed
- App downloads were 404ing. Recent releases were tagged without native binaries, so GitHub's “latest” shadowed the real build. The Download page now links to the newest release that actually contains each platform binary.
v1.64.0
Dashcam GPS Import (Kenwood)
2026-06-04
Added
- Use GPS from your dashcam (Kenwood & others). Extract the embedded GPS to GPX/CSV (ROUTE WATCHER II or exiftool) and upload it as your route track — it auto-correlates with your datalog. The CSV parser now reads dashcam/exiftool GPS columns directly.
v1.63.2
Gear From RPM÷Speed (Relative Match)
2026-06-04
Fixed
- The gear readout/shifter lands on the right gear reliably — it derives the gear from engine RPM ÷ vehicle speed with a relative tolerance, so it stays correct across all gears and tolerates small tyre/final-drive differences.
v1.63.1
Correct Subaru Gear Data + Speed Math
2026-06-04
Fixed
- Corrected the Subaru gear ratios & final drives (per model, sourced) so a 5-speed no longer shows a phantom "Gear 6" and the computed speed is properly scaled.
- The playback car now stops at idle and reaches the real speed — it uses the fresh RPM + gear + wheel-size estimate (with idle-stop) and prefers the logged Vehicle Speed channel when present.
v1.63.0
Cluster On by Default + Speed Badge + Resizable Gauges
2026-06-04
Changed
- The OEM gauge cluster now shows by default when one matches your car, and every Subaru gets a dash (a clean generic cluster fills in where there's no exact OEM face yet).
Added
- Speed badge on the playback car — current mph/kph right on the map marker.
- Center-zero needles — gauges that can read negative (knock feedback, fine knock learning, AF correction/learning) now rest at the middle of the arc.
- Resizable gauges — drag the corner handle to grow/shrink a gauge; size is saved. Still draggable.
v1.62.0
Speed-Accurate Playback + Wheel Size
2026-06-04
Fixed
- The playback car now drives at the real speed — it stops at stop signs and idles. When a log has no vehicle-speed channel it derives speed from RPM + gear + wheel size (with idle-stop), so the car accelerates, slows and stops the way the drive actually happened instead of gliding at a constant pace.
Added
- Wheel & tyre size on the vehicle — set width/aspect/diameter (defaults to your model's stock size, override anytime); it feeds the playback speed, the gear/shifter readout, and calculated speed.
v1.61.0
OEM Gauge Clusters + Chase Cam + Shifter
2026-06-04
Added
- OEM-style gauge clusters in the player — your map stays the full view with a faithful Subaru cluster docked across the bottom (Bugeye, Hawkeye, EJ STI, GR/GV, VA FA20, VB FA24), auto-picked for your car and switchable to any model.
- Chase-cam mode: keep the car centered and let the map move under it, or stick with the fixed route view.
- H-pattern shifter for manual cars that snaps to the current gear (computed live from RPM, speed & gear ratios).
v1.60.2
Signup Phone Defaults to +1
2026-06-04
Changed
- The signup phone field now starts with +1 so US/Canada users don't have to type the country code.
v1.60.1
Play Each Trip Leg
2026-06-04
Added
- Each datalog in a trip now has its own ▶ Play button — replay any individual leg of a multi-datalog trip (car on the route + live gauges).
v1.60.0
Play the Trip + Reliable Reprocess
2026-06-04
Added
- ▶ Play Trip — when a datalog belongs to a trip, replay the whole trip from the start: a car drives the route start-to-finish on the map while your gauges play live. Launchable straight from the trip page.
Fixed
- Trip reprocessing now actually runs. It executes immediately instead of waiting on a background worker that might never fire, and always finishes with a clear result.
v1.59.0
Dash Skin Player
2026-06-04
Added
- Dash Skin for the datalog player: a new 🚗 Dash view plays your log over a car-dashboard image — a built-in WRX/STI/generic cluster or your own uploaded dash photo — with each gauge shown as a clean widget or a calibrated live needle placed right over the real gauge face.
v1.58.4
Size-Optimized Native Binaries
2026-06-04
Changed
- The desktop helper downloads are now size-optimized on every platform (smaller, faster-to-download builds) via max size optimization, link-time optimization, dead-code elimination, and symbol stripping.
v1.58.3
Universal macOS Build
2026-06-04
Changed
- The macOS desktop helper is now a Universal app — one download runs natively on both Intel and Apple Silicon Macs.
v1.58.2
macOS Native Build Targets Intel
2026-06-04
Fixed
- The macOS desktop helper now builds for Intel (x86_64) — matching the build machine — and runs on Apple Silicon via Rosetta 2. (The previous arm64 target couldn't link on the Intel builder.)
v1.58.1
Unstick the Reprocess Loop
2026-06-04
Fixed
- Fixed a trip getting stuck "reprocessing" and the page refreshing in a loop — the background worker now actually finishes queued reprocess jobs, and the auto-refresh stops after a bit with a manual Refresh / Stop prompt.
v1.58.0
Stop a Reprocess
2026-06-04
Added
- A ■ Stop button while a trip is reprocessing — cancel a reprocess you didn't mean to start (or that's taking too long) and keep your current routes unchanged.
v1.57.3
Find Your OSRM Address
2026-06-04
Added
- A new "OSRM Address" diagnostic that the runner self-reports — its public IP, whether OSRM is up, and the exact
OSRM_FALLBACK_URLcandidates to use — so you can find the address your app should point at.
v1.57.2
Setup-Env Keeps OSRM In Sync
2026-06-04
Added
- The "Setup environment variables" workflow now keeps your self-hosted routing URL in sync alongside the rest of the app config, so a single env run covers OSRM failover too.
v1.57.1
OSRM Setup Auto-Writes the App Env
2026-06-04
Added
- The OSRM Setup workflow can now configure routing for you: give it the URL your app should use to reach your self-hosted OSRM and it writes (or confirms)
OSRM_FALLBACK_URLin the live environment and verifies the server is reachable — no manual.envediting or redeploy.
v1.57.0
Queued Reprocess + OSRM Failover
2026-06-04
Added
- Reprocess now runs in the background. Clicking ↻ Reprocess no longer freezes the page — the trip shows a "⏳ Reprocessing…" banner and refreshes automatically when the new routes are ready, with your current routes kept on the map in the meantime.
- Self-hosted routing failover. Route estimation now automatically falls back to your own OSRM server (
OSRM_FALLBACK_URL) when the free public routing server is rate-limited or down — so reprocess gets real road routes far more reliably.
v1.56.1
Reprocess Actually Finds New Routes
2026-06-04
Fixed
- Reprocess no longer hands back the same routes. When the routing provider was unreachable, reprocess used to fall back to a fixed synthetic guess that ignored which routes you'd already been shown — so you got the same shapes every time. It now honours what was already offered, draws from a much wider pool of variations, and tells you "no different routes were found" once the fresh options are exhausted (instead of silently re-offering old ones).
v1.56.0
Audit Everyone, Not Just Admins
2026-06-04
Changed
- The audit log now records every signed-in user's actions, not just admins. Logging moved to the one chokepoint every authenticated write passes through, so nothing slips by based on user status. Each action gets a readable slug (e.g.
trips.lock,admin.users.toggle) with the target, method, and path. Page views (GET) are excluded so the log stays a record of real actions.
Fixed
- The audit log's "To" date now defaults to today, so the default view includes the latest activity.
v1.55.1
Drop Routes You Didn't Take
2026-06-04
Fixed
- Trips no longer hold onto routes you didn't take: each candidate has a ✕ "Didn't take this" remove button, locking a route clears the others, and reprocess no longer re-offers the same routes when it can't find different ones.
v1.55.0
Lock a Trip Route + Whole-Trip Weather
2026-06-04
Added
- Lock a trip's route — when a candidate is correct, lock it in and reprocessing/re-matching won't change it (unlock anytime).
- Weather across the whole trip — sampled at start, midway and finish, with a summary of temperature/density-altitude ranges and whether it rained en route.
v1.54.1
Reprocess Offers Different Routes
2026-06-04
Changed
- Reprocessing a trip now offers different routes — it excludes the candidates already shown and pulls more road detours, so you get genuinely new paths instead of the same set.
v1.54.0
Trip Weather/Conditions, Auto-titles & 95% Route Refinement
2026-06-04
Added
- Trip weather & driving conditions — each trip shows the historical weather at that place/time plus what matters for the car: density altitude / air density, dew point, and a plain-English power note.
- Clever auto-titles for untitled drives — e.g. "12.4-mi run, Manhattan → Wamego" from the route's start and finish.
Changed
- Route matching refines toward 95% confidence and now knows a datalog may be only part of a trip — it estimates the coverage and shows the match confidence on the trip page.
v1.53.0
Smart Upload Preset Tabs by Subaru Type
2026-06-04
Added
- Smart Upload's recommended-preset panel is now tabbed by Subaru type (EJ WRX/STI 02–14, FA DIT WRX 15+, General), each preset has a Download .ptc button, and there's a "Build your own preset" link to the builder.
v1.52.1
Audit Admin Actions
2026-06-04
Added
- Admin actions are now recorded in the audit log — every administrator change (e.g. toggling a user, granting credits, reprocessing/deleting trips, implementing a suggestion) is captured with a semantic action + target.
v1.52.0
Contributor & Referrals Dashboard Cards
2026-06-04
Added
- Two more dashboard cards in "+ Add card": Platform Contributor (your badge + shipped ideas + suggest-a-feature) and Refer & Earn (referral link, AI credits, friends referred).
v1.51.0
Trip Reprocess & Bulk Delete, Self-hosted OSRM
2026-06-04
Added
- Reprocess a trip's routes to re-fetch fresh road-following options — on the trip page, in a new Admin → Trips view (with "Reprocess all"), and via the API.
- Bulk-delete trips — select several and delete at once, on the web and via the API.
- Self-hosted OSRM setup (docker-compose + a one-click workflow) so routing runs on your own server (set
OSRM_BASE_URL).
Fixed
- Native build no longer aborts on a transient apt hiccup on the runner.
v1.50.0
Road-Following Candidate Routes
2026-06-04
Changed
- Candidate routes now follow the roads — trip/route estimates (from start & finish, or from two photos) return three distinct routes that follow real roads, using OSRM (free, no key) plus road detours. No more straight-line guesses.
- Matching a datalog finds routes that fit it — selecting a datalog re-searches road routes targeted to that datalog's measured distance, then picks the closest.
Fixed
- Native app builds run on the on-prem runners (Linux + macOS) and attach binaries to the release.
v1.49.0
Suggestions & Contributor Badges, Referrals, Multi-datalog Trips
2026-06-04
Added
- Make a Suggestion — submit ideas by typing or by voice (transcribed in your browser). When your idea ships we say thanks, notify you, and give you a Platform Contributor badge that levels up with a shipped-features counter on your public profile.
- Refer & Earn — share your personal referral link and earn AI credits when a referral becomes a paying customer.
Changed
- Trips now hold multiple datalogs — a trip can contain many datalogs (each with its own fit score), while a datalog still belongs to at most one trip.
v1.48.0
Trips, Add-a-Card Dashboard & Smarter Suggestions
2026-06-04
Added
- Trips — a new section for the drives behind your datalogs, with a 1-to-1 datalog link (they cross-link). Create a trip by drawing turns & stops, dropping two geotagged photos, or entering start/finish; then match a datalog and see how well it fits (distance + stops + speed-vs-gearing).
- Add cards to your dashboard — a new "+ Add card" menu with a catalog of optional data cards (Health Trend, Top Anomaly, Recent Trips, Fleet Health, and more), each draggable, resizable, and remembered.
Fixed
- Datalog suggestions only show for channels you didn't log — IAT/coolant/etc. were being suggested even when present due to a naming mismatch.
v1.47.0
Audit Log, Async Route Matching, Native Download, Speed Unit & Card Sizes
2026-06-04
Added
- Admin audit log — every notable user action is recorded and viewable by admins at Admin → Audit Log, filterable by user, action and date.
- Turn-by-turn route matching — route estimates now detect the drive's stops/idle and hard launches and pick the best-matching of the three candidate routes (robust to hard driving).
- Heavy jobs run in the background — big datalogs process the route off the web request and message you when ready; the page updates itself.
- Download the native app — a new /download page + sidebar link, with CI building native binaries and attaching them to releases.
- Dashboard cards have three sizes (S / M / L) next to each card's drag handle, remembered per user.
Changed
- The Vehicle Speed gauge shows KPH or MPH based on the datalog's firmware unit.
v1.46.0
RPM Tach Gauge + Anomaly Digest Fix
2026-06-04
Changed
- The RPM gauge is now a proper tach — 0–7000 with 0–7 indicators, the needle sweeps only 5/8 of the arc, and anything over 5700 RPM is a red danger zone.
Fixed
- The "Anomaly Digest" heading on the dashboard no longer jumps to the right edge (drag-handle layout fix).
v1.45.0
Smart Upload for Every User
2026-06-04
Added
- Smart Upload is now available to every user (a new sidebar item) — drop in one or many logs with no need to pick a vehicle first; each is auto-assigned to a matching vehicle or a new one is created from its AP Info. Optionally attach a drive with two geotagged photos.
- Entitlement-aware: your free analysis, credits, or annual plan apply per log just like a normal upload; extra logs wait for payment (no paywall bypass).
v1.44.0
Add a Route to a GPS-less Datalog
2026-06-04
Added
- Datalogs without GPS now have an "Add a route to this drive" card — give a start and finish as place names, two geotagged photos, or upload a real GPS track.
- For place names / photos we estimate three candidate routes and pick the one whose distance best matches what the datalog actually drove (from speed × time), then the player drives a speed-aware car along it.
v1.43.0
Calculated Speed / VSCSD + Speed-aware Route Playback
2026-06-04
Added
- Calculated Speed + VSCSD — datalogs now derive a calculated speed from RPM and the delta vs. logged vehicle speed (Vehicle Speed / Calculated Speed Delta). A large delta flags clutch slip, wheelspin, or out-of-gear coasting. Both show as channels in the player.
- Speed-aware route playback — the car on the estimated route now moves by distance travelled (speed integrated over time), so it pauses at stops and tracks the real pace of the drive instead of sliding at a constant rate.
v1.42.0
Gauge Groups, Route Playback & Map Geocoding
2026-06-04
Added
- Gauge groups in the player — one-click curated sets (Knock Health, Fueling/AFR, Boost Control, Thermal, Speed & Load, Core Overview) that monitor related channels together, flag warnings/criticals for this drive, and link to Troubleshooting.
- Estimated-route playback — when a log has no GPS track but a route was estimated from odometer photos, the player draws it and drives a car marker along it in sync with playback.
- Automatic location lookup — type a place name (e.g. "Manhattan, KS") in your profile and we geocode it for you; no need to enter raw coordinates.
Fixed
- The datalog player map now centres on your location instead of defaulting to Japan when your profile had a place name but no coordinates.
v1.41.1
Real-time Playback Fix
2026-06-04
Fixed
- The datalog player now plays in real time again — playback was running ~10× too fast (a 2m 32s log finished in seconds). 1× now equals real time, and the 2×–100× speeds scale correctly.
v1.41.0
Draggable Sub-cards (Vehicles & Recent Activity)
2026-06-04
Changed
- On the dashboard, Your Vehicles and Recent Activity are now separate, independently draggable cards — reorder or swap them on their own, and each remembers its position.
Added
- The card drag-and-drop system now supports sub-cards that are draggable within their parent card (not just top-level cards), each group remembering its own order.
v1.40.0
Three Estimated Routes + Smart Upload EXIF Matching
2026-06-04
Added
- The photo route estimate now always shows up to three different candidate routes on the map to compare — when only one or two real road routes are available, gently-curved estimate variations fill in the rest so you always have three to choose from.
- Smart Upload (admin) now accepts an optional geotagged before/after odometer photo pair: it reads each photo's EXIF time and GPS, estimates three routes, and automatically attaches the route + photos to whichever datalog in the upload best matches the drive's length — at processing time.
v1.39.0
Attach Mileage Photos & Route to a Datalog
2026-06-04
Added
- From the photo-match results you can now attach the odometer photos and the estimated route map to a datalog — with a preview & confirmation step first.
- Once attached, the analysis page shows a "Mileage photos & route" card (the before/after photos and the route on a map), with one-click detach.
v1.38.0
Photo EXIF Time → Datalog Match
2026-06-04
Added
- Mileage-route before/after photos now also capture their EXIF capture time. The gap between the two photos is your drive's real duration.
- The results page lists the vehicle's datalogs whose length best matches that drive time, with the time difference for each and a highlighted best guess — so you can find which log belongs to the drive.
v1.37.2
Message Recipient Auto-complete + Channel Opt-in
2026-06-04
Added
- Admins can pick a message recipient via auto-complete (search by name or email), with optional Email/SMS delivery that defaults to off (in-app only).
Fixed
- Messaging email/SMS now actually send — they referenced a non-existent column and were silently skipped.
v1.37.1
Mileage-Route Map on Leaflet
2026-06-04
Changed
- The mileage-route map now uses Leaflet / OpenStreetMap instead of Google Maps — no map key needed, consistent with the player and analysis maps. All in-app GPS mapping is now Leaflet.
v1.37.0
In-App Messaging & Admin Delete-with-Notice
2026-06-04
Added
- In-app messaging — bi-directional threads between you and the CobbVision team. A Messages inbox with an unread badge; replies and notifications also go out by email (and SMS when your phone is verified).
- Admins can remove a stuck datalog and automatically notify you with the reason, in-app and by email.
v1.36.0
Drive Findings, Center-Zero Gauges & Troubleshooting
2026-06-04
Added
- A drive findings engine that flags where channels go outside their recommended ranges (DAM below max, knock retard under load, lean AFR under boost, overboost, hot IAT, and more) — engine-family aware and condition-scoped.
- Center-zero gauges: channels that can go negative (feedback knock, fine knock learning, AF correction) now zero at the middle of the arc.
- Gauges turn red live when a value crosses its recommended limit (e.g. DAM < 1.0).
- Drive Summary on the player (scrubber markers + jump-to) and analysis page, plus a findings-driven Troubleshooting page explaining each issue, its datalog evidence, and how to fix it.
v1.35.1
Real-time Playback + Ludicrous Mode
2026-06-04
Changed
- Datalog Player playback is now real-time — 1× means one second of wall-clock equals one second of log time.
- New speed tiers: 1×, 2×, 4×, 6×, 8×, 10×, and LUDICROUS MODE (100×).
v1.35.0
Vehicle History (Recalls, NMVTIS, CarFax-ready)
2026-06-04
Added
- Provider-agnostic vehicle history — free NHTSA recalls, paid NMVTIS title/odometer/salvage history (VinAudit), and a CarFax driver stub ready for a partnership. Cached in a
vehicle_historytable. - Surfaced on the vehicle page, the Engine Health page, and read-only on public profiles (
/v/{slug}) when the owner opts in. - Odometer-rollback validation — the mileage-photo route flow warns when a photo reading is below the vehicle's historical mileage.
- Paid history reports are gated to paying customers and admins; free recalls are available to any owner.
v1.34.0
API Docs & Developer Access
2026-06-04
Added
- A Developer / API docs page at
/developer— full v2 REST API reference (auth, scopes, rate limits, every endpoint withcurl+ sample JSON) and a "your API keys" panel. - API access is gated to admins and paying customers (active subscription or analysis credits); everyone else sees an upsell. Key creation is gated the same way.
- API surfaced in navigation: admin sidebar gets "API Keys" + "API Docs"; paying users get a "Developer" item.
- Canonical OpenAPI 3.1 spec + reference, served at
/developer/openapi.yamland mirrored to a private docs repo that auto-syncs as the API evolves.
v1.33.0
Player All-Channels + Custom Gauges, Landing & About
2026-06-04
Added
- Datalog Player gauge customization — choose which channels get a gauge, each gauge's type (arc / bar / number / sparkline) and size, and drag them anywhere. Layout persists across sessions.
- The player's gauges now float over a Leaflet map — your GPS route when available, otherwise centered on your saved location or Subaru's Gunma plant.
- Optional account location (manual or one-tap geolocation) used as the player map default.
- A big marketing landing page at
/for logged-out visitors with login at the top, plus an About page at/about.
Fixed
- The Datalog Player only surfaced 13 hardcoded channels — every other logged Cobb monitor (AF correction/learning, boost targets, AVCS, fuel pressure, ethanol, …) was ignored. It now reads all channels present in the log.
v1.32.0
GitHub Actions Compute Offload
2026-06-04
Added
- Heavy datalog processing, reprocess, route-estimation, and baseline jobs now run on a self-hosted GitHub Actions runner instead of DreamHost's 512 MB-capped PHP processes.
compute_jobstable queues work; the app fires arepository_dispatchevent and a runner CLI script picks it up and writes results back.- Idempotency-keyed jobs prevent duplicate dispatch of the same work.
Changed
- CI workflows hardened for the self-hosted runner — explicit runner labels, concurrency guards, and step timeouts so offloaded jobs can't collide or run unbounded.
v1.31.1
Migration Chain Hotfix
2026-06-04
Fixed
- A stray
AFTER categoryclause in the v1.28 migration referenced a non-existent production column and aborted the entire migration chain — v1.28–v1.32 had never applied on the live database. Removed the clause; migrations now run clean.
v1.31.0
Wrong-Vehicle Flow & Route Estimation
2026-06-04
Added
- Wrong-vehicle datalog decision flow — when a log's AP map-file identity doesn't match its target vehicle, the session is quarantined (
status = vehicle_mismatch) and the user chooses: create a new vehicle, add it anyway, or discard. - Mileage-photo → GPS route estimation — reads EXIF GPS from before/after odometer photos, OCRs the odometer reading, and asks the Google Directions API for three candidate routes, drawing the best-guess match on a Google Map.
- DB migrations v1.31 (
vehicle_mismatchstatus enum) and v1.32 (mileage_routestable).
v1.30.0
Engine Health & Draggable Cards
2026-06-04
Added
- Engine Health page per vehicle (
/vehicles/{id}/health) — scores cross-channel relationships across all of a vehicle's logs with plain-English explanations. - Draggable, reorderable cards (SortableJS) persisted across logins via the
user_preferencestable (DB migration v1.30).
Changed
- Relationship scoring now excludes sessions that didn't log a channel — a missing monitor no longer counts against a vehicle's score ("assess what we know").
v1.29.0
Public Vehicle Profiles
2026-06-04
Added
- Slug-based vehicle URLs —
vehicles.slug(unique) andvehicles.is_public(DB migration v1.29). - Public vehicle profiles at
/v/{slug}with Open Graph and Twitter share-card meta tags. - Admin maintenance tools: "Delete All CSVs" and "Reset Site".
v1.28.0
AP Preset Builder
2026-06-03
Added
- AP Preset Builder at
/presets/builder— compose Cobb Accessport Data Log Preset files (.ptc) by selecting channels by category. - 80+ mapped
IDS_*channel identifiers; max 32 channels (AP3 hardware limit) enforced with a live counter. - Session preset download from the analysis page — auto-built from your log's detected channels plus recommended knock-safety additions.
- 12 system preset templates (WOT Pull, Knock Health, Fuel Trim, AVCS Cam, Thermal, Boost Check, Ethanol, and more).
- "AP Preset .ptc" button on every completed analysis page.
- Step-by-step USB and Accessport Manager installation instructions in the builder sidebar.
- Public changelog page (this page) at
/changelog. - Version badge in the site footer.
Fixed
- Roughly 60 columns (coolant, IAT, AVCS, boost targets, etc.) were silently mapping to wrong keys in the analysis engine — charts and gauges appeared empty. Unified alias resolution to a single static method.
- Arc gauges on the player showed ~30% of their target value on page load due to a lerp-on-first-draw bug. Gauges now snap instantly when paused or scrubbing.
- Vehicle speed displayed in km/h as if it were mph for datalogs with KPH-labelled columns. Parser now detects and converts automatically.
- Gear ratios for 2006–2007 WRX MT were incorrect (02–05 box values used instead of TY754VB5AA).
v1.27.0
Datalog Player
2026-05
Added
- Full-screen Datalog Player with arc gauges, Chart.js sparklines, GPS lap map, scrub bar, and playback speed control.
- Eight key columns promoted from JSON blob to typed DB columns for faster queries: vehicle speed, ignition timing, DAM, fine/feedback knock, knock count, coolant temp, intake air temp.
- Channels with no recorded data are hidden rather than shown as empty gauge slots.
- "Add these AP channels" suggestion panel — shows what was missing from your log and links to the Preset Builder.
Fixed
- Analysis charts not populating for temperature, AVCS, and boost target channels (unified alias map fix).
- Player speed calculation now uses vehicle-specific gear ratios from the database.
v1.26.0
Vehicle Gallery Polish
2026-04
Added
- Cover photo designation for vehicle galleries.
- Per-photo captions and sort order.
- Vehicles can be set active or inactive.
- Vehicle description, mileage, and trim fields.
v1.25.0
Schema Stability
2026-04
Changed
- Comprehensive schema backfill migration ensures all required columns exist regardless of when the database was first created. Eliminates class of "column not found" errors on older installs.
v1.24.0
User Relationship Rules
2026-03
Added
- Users can create their own column relationship rules (personal tuning heuristics).
- Admins can promote community-submitted rules to site-wide status.
v1.23.0
Scoped API Keys
2026-03
Added
- API keys support type (user / admin / service), per-hour rate limits, IP allow-list, expiry date, and human-readable description.
- Account page and admin panel for managing scoped keys.
v1.22.0
Engine Family Rules
2026-02
Added
- Column relationship rules can be scoped to EJ, FA-DIT, FA24, or universal — prevents EJ-specific knock thresholds from firing on FA DIT engines where sub-1.0 DAM is normal.
- 16 community-validated heuristic rules added (real vs false knock, AFR targets, failure signatures, EJ/FA quirks).
v1.21.0
Vehicle Specs & Speed
2026-02
Added
- Vehicle specs database (gear ratios, final drive, tyre size) for WRX and STI 2002–2021.
- Accurate gear-ratio-based speed calculation in the Datalog Player.
v1.20.0
Real vs False Knock
2026-01
Added
- Coordinated relationship type — flags real knock only when feedback knock, DAM drop, and positive boost all occur simultaneously.
- Trend relationship type — detects DAM sustained below maximum across the whole log.
- Community knock-discrimination rules based on NASIOC, ClubWRX, and tuner write-ups.
v1.19.0
Analysis Cache
2026-01
Added
- Analysis page now loads from a pre-rendered JSON cache — no per-view analysis recalculation, no NASIOC HTTP requests on every page load.
- Cache refreshed only when the log is reprocessed.
- Reprocess-all admin workflow for bulk cache refresh.
v1.18.0
Relationship Engine
2025-12
Added
- Cross-channel anomaly detection — relationships between columns with conditional thresholds (e.g. AFR lean only flagged when boost > 5 psi).
- Relationships management page for users and admins.
- 22 initial Cobb-derived cross-channel rules seeded.
- Pending column queue for novel channel names found in user logs.
v1.16.0
Payments & Crypto
2025-11
Added
- Monthly subscription tier ($5/month) alongside existing annual plan.
- Crypto payments via NOWPayments (BTC, ETH, USDC).
- Billing page with credit bundle purchasing.
v1.15.0
REST API v2
2025-11
Added
- REST API v2 (
/api/v2/) with Bearer token auth, scoped keys, rate limiting, and paid-resource policy. - Endpoints: vehicles CRUD, sessions, API key management, usage log.
v1.13.0
Mod Attachments
2025-10
Added
- Upload photos and PDF receipts against any modification entry.
- Text descriptions per attachment.
v1.12.0
Vehicle Photo Gallery
2025-09
Added
- Multi-photo gallery per vehicle with cover photo designation.
- Cover photo shown on dashboard vehicle cards.
v1.10.0
GPS Data Sources
2025-09
Added
- Strava OAuth integration — activities auto-matched to datalogs by date.
- Google Takeout GPS import.
- Auto-date matcher — finds when an undated datalog was captured by speed-trace cross-correlation with GPS history.
v1.8.0
CobbVision AI
2025-08
Added
- Contextual AI chat on any analysis session.
- Bring-your-own API key: OpenAI, Anthropic, Google Gemini.
- CobbVision AI credits (purchased bundles) as an alternative.
- Self-hosted Ollama support — no key or credit cost.
- AI narrative: structured health summary generated on demand.
v1.3.0
GPS Tracking
2025-05
Added
- GPS track upload and correlation with datalog via speed-trace cross-correlation.
- Supports GPX 1.1, NMEA 0183 (all talker IDs), u-blox UBX binary, and CSV.
- Lap trace map overlay on the analysis page.
v1.1.0
Native Client
2025-04
Added
- API key system for the native C++ companion daemon (
cobbvision-reader). - Native daemon watches the AccessPoint USB drive and auto-uploads new datalogs.
- Encrypted upload endpoint (
AES-256-GCM + RSA-OAEP).
v1.0.0
Initial Release
2025-04
Added
- ECU datalog upload and parsing for Cobb AccessPoint CSV files.
- Anomaly detection with RPM-scoped and boost-scoped thresholds.
- Health score (0–100) with per-channel charts.
- Vehicle management with modification tracking.
- Stripe payments: $5/log or $25/year unlimited.
- Google and Facebook OAuth, Twilio SMS verification.
- Dark theme responsive UI. Deployed on DreamHost.
CobbVision v1.94.2 · Not affiliated with Cobb Tuning · Data Sources