feat(apps): MagicMirror as a Void app (#/mirror, mirror.hynesy.com)
Embed MagicMirror² (CT 111) via the shared embedView factory, exposed at mirror.hynesy.com through Traefik + CF Access. Traefik mirror-frame middleware swaps MM's X-Frame-Options for a CSP frame-ancestors allowing the Void origins. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -29,6 +29,7 @@ const VIEWS = {
|
||||
'ai-usage': () => import('./views/aiusage.js'),
|
||||
obd2: () => import('./views/obd2.js'),
|
||||
links: () => import('./views/links.js'),
|
||||
mirror: () => import('./views/mirror.js'),
|
||||
settings: () => import('./views/settings.js'),
|
||||
jobs: () => import('./views/jobs.js')
|
||||
};
|
||||
|
||||
@@ -133,7 +133,8 @@ export function renderSidebar(root) {
|
||||
navItem('Timelapse', '/timelapse'),
|
||||
navItem('AI Usage', '/ai-usage'),
|
||||
navItem('OBD2', '/obd2'),
|
||||
navItem('Links', '/links')
|
||||
navItem('Links', '/links'),
|
||||
navItem('MagicMirror', '/mirror')
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ const ROUTES = [
|
||||
{ name: 'ai-usage', re: /^\/ai-usage$/, keys: [] },
|
||||
{ name: 'obd2', re: /^\/obd2$/, keys: [] },
|
||||
{ name: 'links', re: /^\/links$/, keys: [] },
|
||||
{ name: 'mirror', re: /^\/mirror$/, keys: [] },
|
||||
{ name: 'settings', re: /^\/settings$/, keys: [] },
|
||||
{ name: 'jobs', re: /^\/jobs$/, keys: [] },
|
||||
{ name: 'home', re: /^\/?$/, keys: [] }
|
||||
|
||||
6
public/views/mirror.js
Normal file
6
public/views/mirror.js
Normal file
@@ -0,0 +1,6 @@
|
||||
// public/views/mirror.js — #/mirror (MagicMirror² on CT 111)
|
||||
import { embedView } from './embed.js';
|
||||
export const render = embedView({
|
||||
title: 'MagicMirror', sub: 'smart mirror dashboard',
|
||||
src: 'https://mirror.hynesy.com/'
|
||||
});
|
||||
Reference in New Issue
Block a user