Skip to content

Selected work / Personal project / 2026

CabinWise

A personal companion for my Tesla

Built for my 2025 Model 3, CabinWise lets me check battery and charging readings, control the cabin climate, change the charge limit, and send destinations from one dashboard. It also includes an interactive 3D vehicle view, saved departure presets, and a private ChatGPT connection.

Explore the features
CabinWise / Model 33D PREVIEW · SAMPLE DATA

Enable JavaScript to explore the Model 3 in 3D.

Drag or use arrow keys to rotate
Battery72%
Cabin76°F
Charge limit80%
About this 3D view

Same Model 3 asset and camera setup as CabinWise. Glass and wheel overlays cleaned up; paint materials adjusted. Appearance is illustrative, not live vehicle state. Model by tonielpro520, licensed CC BY 4.0.

The app’s actual 3D model, with fictional portfolio readings. No vehicle connection.

My role
Design & full-stack engineering
System
Web app · Command gateway · AI tools
Scope
Personal, single-owner vehicle access

Features

A few useful things, all in one place

Check on the car, prepare for a drive, or ask ChatGPT to help with a specific task. Readings are clearly marked when they are old or unavailable.

SEE

A clear vehicle view

A native, interactive 3D preview alongside battery, cabin temperature, and charging readings. Stale and unavailable values have explicit states.

PREPARE

Daily actions, reviewed

Climate controls, charge-limit changes, saved departure presets, and destination sending. Presets load locally; saving one does not schedule an action.

CONNECT

AI with boundaries

A private ChatGPT MCP connection exposes status, destination, climate, and charge-limit tools, gated by expiring permissions and a revoke control.

PLAN

Keep stops in order

Save an ordered list of stops, then review and send one selected destination at a time. Each send is a separate action, rather than a complete multi-stop route.

Explore the interaction

Making data freshness clear

Try three fictional reading states. The illustration below explains the dashboard’s behavior; it is a standalone portfolio demo with no vehicle connection.

Sample data only

Vehicle readings
Battery72%
Cabin76°F
Charging7 kW

Fresh sample · just now. A measured cabin temperature is separate from the requested target.

Engineering decisions

Handling commands with care

Accepted ≠ observed

The gateway can report that Tesla accepted a command. The UI verifies supported settings against a subsequent vehicle reading and its subsystem timestamp. A climate setpoint is never presented as the measured cabin temperature.

If delivery is uncertain, the result stays uncertain. The app does not automatically resend the physical action. MCP request IDs retain results within the active process so a repeated ID cannot silently deliver the same action again.

Waking a sleeping vehicle

Status reads stay passive. A requested command can wake the vehicle once, then check readiness within a bounded wait. The web flow allows up to one minute; it sends the command only when readiness is confirmed in time.

The gateway validates inputs and signed requests, including timestamps and replay checks. These are layered protections, not a claim of exactly-once delivery across restarts or network failures.

  1. Review the actionValidate the requested change and confirm intent.
  2. Prepare the vehicleWake if needed. Wait for readiness within a deadline.
  3. Send the commandTrack acceptance; preserve uncertainty on failure.
  4. Check the readingUse fresh reported state to distinguish a result from an acknowledgement.

Architecture

How it fits together

The browser never receives a raw signing key. Owner checks and encrypted, secure HTTP-only sessions protect the app’s Tesla authorization. A constrained command gateway separates the web experience from the signing service.

Private app + MCPOwner identity · scoped tools
Gateway + signerValidated, signed requests
Tesla Fleet APIReadings · vehicle commands

A narrow command path

A Node gateway and Tesla signing service run in Docker on DigitalOcean, behind Cloudflare access controls and a tunnel. The gateway checks a separate secret and HMAC request signatures. The raw signer is not publicly exposed.

Permission is temporary

MCP grants separate status, navigation, climate, and charging access. They expire, can be revoked, and are checked for every tool call. Tesla access for MCP stays in process memory, bounded by the grant and session expiry.

Deliberate scope

What it does today

The result is a personal tool for a real vehicle, spanning an interactive frontend, a protected command service, and permission-scoped AI access. Its most important design choice is preserving uncertainty wherever the system cannot verify an outcome.

  • One destination at a time. An ordered stop list lets the owner review and send a selected stop. It does not send a complete multi-stop itinerary, optimize routes, or detect arrivals.
  • Presets are not schedules. Saved departure settings stay in the browser and require an explicit action. Autonomous scheduling is outside the verified scope.
  • No background-telemetry claim. This case study covers requested readings and controls, not continuous vehicle monitoring or a working telemetry history.
  • Private by design. The source and operational app remain private. This page provides an ungated explanation and fictional sample data.