feat(apps): OBD2 placeholder rail item (launchpad for the parked OBD2 project)
Adds an OBD2 item to the Apps rail; with no records UI deployed yet it links to the OBD2 Telemetry project + tasks and the research/wiki page rather than embedding. Swap to embedView once LubeLogger/Tracktor is up. → 2.1.1. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,9 @@
|
||||
All notable changes to Void 2.0 are documented here.
|
||||
Format: [Keep a Changelog](https://keepachangelog.com).
|
||||
|
||||
## 2.1.1 — OBD2 Apps rail placeholder
|
||||
- **OBD2 Apps rail item** (`public/views/obd2.js`, router/app/sidebar): a placeholder launchpad under **Apps** for the parked OBD2 Telemetry project — links to the project + tasks and the research/wiki page. Swap to an `embedView` once a records UI (LubeLogger/Tracktor) is deployed.
|
||||
|
||||
## 2.1.0 — LAN device discovery
|
||||
- **`lan_devices` store + hourly `arp-scan`** (`migration 024`, `lib/infra/scan.js`,
|
||||
`lib/db/repos/lan_devices.js`, `lib/cron`): the Devices band is now DB-backed and
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "void-server",
|
||||
"version": "2.1.0",
|
||||
"version": "2.1.1",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -27,6 +27,7 @@ const VIEWS = {
|
||||
terminal: () => import('./views/terminal.js'),
|
||||
timelapse: () => import('./views/timelapse.js'),
|
||||
'ai-usage': () => import('./views/aiusage.js'),
|
||||
obd2: () => import('./views/obd2.js'),
|
||||
settings: () => import('./views/settings.js'),
|
||||
jobs: () => import('./views/jobs.js')
|
||||
};
|
||||
|
||||
@@ -131,7 +131,8 @@ export function renderSidebar(root) {
|
||||
el('div', { class: 'sb-section' },
|
||||
el('div', { class: 'sb-title' }, 'Apps'),
|
||||
navItem('Timelapse', '/timelapse'),
|
||||
navItem('AI Usage', '/ai-usage')
|
||||
navItem('AI Usage', '/ai-usage'),
|
||||
navItem('OBD2', '/obd2')
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ const ROUTES = [
|
||||
{ name: 'terminal', re: /^\/terminal$/, keys: [] },
|
||||
{ name: 'timelapse', re: /^\/timelapse$/, keys: [] },
|
||||
{ name: 'ai-usage', re: /^\/ai-usage$/, keys: [] },
|
||||
{ name: 'obd2', re: /^\/obd2$/, keys: [] },
|
||||
{ name: 'settings', re: /^\/settings$/, keys: [] },
|
||||
{ name: 'jobs', re: /^\/jobs$/, keys: [] },
|
||||
{ name: 'home', re: /^\/?$/, keys: [] }
|
||||
|
||||
27
public/views/obd2.js
Normal file
27
public/views/obd2.js
Normal file
@@ -0,0 +1,27 @@
|
||||
// #/obd2 — Apps rail placeholder for the OBD2 Telemetry project (parked).
|
||||
// No records UI is deployed yet, so this links into the project + wiki instead of
|
||||
// embedding. Swap to embedView({ src: 'https://obd2.hynesy.com/' }) once the
|
||||
// LubeLogger/Tracktor dashboard is up.
|
||||
import { el, mount } from '../dom.js';
|
||||
import { navigate } from '../router.js';
|
||||
|
||||
const WIKI = '/page/bea9d582-44a2-4eec-a1ba-69ade15d3a73';
|
||||
const PROJECT = '/project/02fc5b4c-12f4-4d0c-8220-6b053da71c46';
|
||||
|
||||
export async function render(main) {
|
||||
mount(main,
|
||||
el('div', { class: 'term-bar' },
|
||||
el('span', { class: 'term-title' }, '◆ OBD2 Telemetry'),
|
||||
el('span', { class: 'muted', style: { fontSize: '11px' } }, 'project · parked, being set up')
|
||||
),
|
||||
el('div', { class: 'card', style: { maxWidth: '760px' } },
|
||||
el('h3', {}, 'OBD2 Telemetry — being set up'),
|
||||
el('p', { class: 'muted' }, 'Capture vehicle records from the car’s OBD2 port into the homelab (CT 112 · Postgres + TimescaleDB) with a maintenance/records UI. The capture pipeline is being rebuilt and the records UI isn’t deployed yet — nothing to embed here yet.'),
|
||||
el('p', {}, 'Plan: AndrOBD (F-Droid) + the BT ELM327 → CSV/MQTT → Timescale; WiCAN hardware later; LubeLogger / Tracktor for the UI (this tile will then embed it).'),
|
||||
el('div', { style: { display: 'flex', gap: '8px', marginTop: '14px' } },
|
||||
el('button', { class: 'primary', onclick: () => navigate(PROJECT) }, 'Project + tasks'),
|
||||
el('button', { class: 'ghost', onclick: () => navigate(WIKI) }, 'Research / wiki')
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
@@ -14,7 +14,7 @@ import { mcpAuth } from './lib/api/middleware/mcp_auth.js';
|
||||
import { handleMcp } from './lib/mcp/http.js';
|
||||
import httpProxy from 'http-proxy';
|
||||
|
||||
const VERSION = '2.1.0';
|
||||
const VERSION = '2.1.1';
|
||||
|
||||
// Proxy /terminal (+ its WebSocket) to ttyd on CT 300, so the embedded terminal
|
||||
// works whether the Void is reached via Traefik (void2-app.hynesy.com) OR the
|
||||
|
||||
Reference in New Issue
Block a user