> {{ l }}

{{ currentTitle }}

{{ currentSub }}

{{ greeting }}, {{ ownerTitle }}.

{{ briefing }}

{{ k.label }}
{{ k.value }}
{{ k.sub }}
Inventory value by make
Units by status
Recent activity
real-time
{{ iconFor(a.icon) }}
{{ a.text }}
{{ ago(a.created_at) }}
Latest alerts
{{ al.severity }}
{{ al.title }}
{{ al.message }}
No alerts. Systems nominal.
{{ vehicles.length }} units
Stock #VehiclePriceMileage StatusDays on lotUpdated
{{ v.stock_no }}
{{ v.year }} {{ v.make }} {{ v.model }}
{{ v.trim || v.body_style }} · {{ v.ext_color }} · {{ v.condition }}
${{ fmt(v.price) }} {{ v.mileage.toLocaleString() }} {{ v.status.replace('_',' ') }} {{ daysOn(v) }} {{ ago(v.updated_at) }}
No vehicles match these filters.
Alert feed ({{ alerts.length }})
{{ al.severity }}
{{ al.title }}
{{ al.message }}
{{ ago(al.created_at) }}
Alert feed is clear.
Alert engine rules

When in-stock count ≤ threshold: dashboard alert + email + SMS (if configured).

Leave blank to disable. Alerts fire the moment inventory changes.

Delivery channels
Dashboard feedACTIVE
Email ({{ settings.alert_email ? settings.alert_email : 'not set' }}){{ settings.alert_email ? 'ACTIVE' : 'OFF' }}
SMS via Twilio{{ settings.twilio_sid && settings.sms_number ? 'ACTIVE' : 'QUEUED — needs creds' }}
Every inventory event emits a signed webhook so your CRM, payment gateway and analytics pipeline stay in sync the moment a vehicle is added, updated or sold. Connect your preferred providers — the contract below stays the same.
{{ i.name }}
{{ i.kind }}
{{ i.status }}
{{ integDesc(i.key) }}
{{ i.last_sync ? 'Last sync ' + ago(i.last_sync) : 'Never tested' }}
Webhook event log
live · newest first
{{ w.integration_key }} → {{ w.event }}
{{ ago(w.created_at) }} · {{ w.status }}
{{ JSON.stringify(w.payload, null, 2) }}
No webhook traffic yet — add or sell a vehicle.
The Jarvis experience: staff and customers glide through every step of dealership operations from one interactive system. Milestone 1 is live on this staging build — each next milestone is scoped with you before a line of code ships.
M{{ m.n }}
{{ m.title }}
{{ m.live ? 'LIVE NOW' : m.status }}

{{ m.desc }}

{{ f }}
{{ a.tag }} {{ a.mins }} min read

{{ a.title }}

{{ a.summary }}

{{ kbArticle.tag }} {{ kbArticle.mins }} min read

{{ kbArticle.title }}

Need more? The admin panel links every guide, and the API Docs view documents the full REST contract.
API reference — Inventory module

Every endpoint lives at /api.php and returns JSON with an { ok: true } envelope. Identical contract ships in the Node.js/Express build (see Setup).

{{ e.m }} {{ e.ep }} {{ e.desc }}
{{ e.sample }}
Project structure (source-controlled)
jarvis/ ├── public/ # Vue 3 SPA + PHP API (this staging build) │ ├── index.html # single-page front end (Vue 3, Tailwind, Chart.js) │ ├── app.js # view models, realtime sync loop, API client │ ├── api.php # REST endpoints (inventory, alerts, integrations) │ ├── lib.php # DB layer (SQLite), alert + webhook engine │ └── seed.php # demo data seeder (idempotent) ├── server.js # Node.js/Express implementation of the same API ├── tests/pricing.test.js ├── Dockerfile # cloud deployment (node:20-alpine) ├── package.json ├── setup.sh # one-command local bootstrap ├── .github/workflows/ci.yml # lint + unit tests on every push └── README.md
Quick start
git clone <repo> jarvis && cd jarvis ./setup.sh # installs deps, migrates DB, seeds demo data npm run dev # Node API + static front end on :3000
Deploy anywhere
docker build -t jarvis . docker run -p 3000:3000 -v jarvis-data:/data jarvis # CI/CD: GitHub Actions runs lint + tests # on every push; deploy job is wired to # your AWS / container platform of choice.
Architecture

Front end: Vue 3 (CDN build on staging, Vite build for production) + Tailwind + Chart.js. State is a single reactive store; the realtime loop polls ?action=sync every 2s and patches only what changed.

Back end: one REST contract, two interchangeable implementations — PHP/SQLite for this staging host and Node.js/Express (server.js) for cloud deployment. Both expose identical endpoints and webhook events.

Integrations: every mutation emits a structured webhook event (vehicle.added / updated / sold, payment.captured, deal.closed). Provider adapters (CRM, POS gateway, Twilio, NHTSA vPIC) plug into the same emitter.

Data: SQLite on staging (zero-config, WAL mode); swap the driver for Postgres in production via a single connection config.

{{ drawer.stock_no }}

{{ drawer.year }} {{ drawer.make }} {{ drawer.model }}

{{ drawer.trim }} · {{ drawer.body_style }} · {{ drawer.condition }}
Price
${{ fmt(drawer.price) }}
Cost / margin
${{ fmt(drawer.cost) }} +${{ fmt(drawer.price-drawer.cost) }}
Mileage
{{ drawer.mileage.toLocaleString() }}
Days on lot
{{ daysOn(drawer) }}
Exterior
{{ drawer.ext_color || '—' }}
Interior
{{ drawer.int_color || '—' }}
VIN
{{ drawer.vin || 'not set' }}
{{ drawer.engine }} · {{ drawer.drivetrain }}
Sold
${{ fmt(drawer.sold_price) }}
{{ ago(drawer.sold_at) }}

{{ form.id ? 'Edit vehicle' : 'Add vehicle to inventory' }}

{{ decodedNote.msg }}
Market engine suggests ${{ fmt(suggested) }}

Mark as sold

{{ sellModal.year }} {{ sellModal.make }} {{ sellModal.model }} · {{ sellModal.stock_no }}

On confirm: status flips to sold, the payment gateway and CRM webhooks fire, inventory health re-checks, and low-stock alerts push to dashboard + email + SMS.

{{ t.title }}
{{ t.body }}