livedesk 0.1.630 → 0.1.631
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/electron/before-pack.cjs +129 -0
- package/electron/electron-builder.yml +4 -3
- package/package.json +1 -1
- package/web/dist/app.webmanifest +1 -1
- package/web/dist/assets/{main-D0eBL1zg.js → main-DvaMzUeB.js} +1 -1
- package/web/dist/index.html +1 -1
- package/web/dist/livedesk-build-evidence.json +10 -10
- package/web/dist/sw.js +1 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
const { createHash } = require('node:crypto');
|
|
2
|
+
const { existsSync, readFileSync, readdirSync, statSync } = require('node:fs');
|
|
3
|
+
const { isAbsolute, join, posix, relative, resolve, sep } = require('node:path');
|
|
4
|
+
|
|
5
|
+
const EVIDENCE_FILE = 'livedesk-build-evidence.json';
|
|
6
|
+
const EVIDENCE_KIND = 'livedesk-production-web-source-evidence';
|
|
7
|
+
|
|
8
|
+
function fail(code, detail = '') {
|
|
9
|
+
throw new Error(`packaged-web-invalid:${code}${detail ? `:${detail}` : ''}`);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function readJson(filePath, label) {
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(readFileSync(filePath, 'utf8'));
|
|
15
|
+
} catch (error) {
|
|
16
|
+
fail(`${label}-invalid`, error instanceof Error ? error.message : String(error));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function validateManifestPath(value) {
|
|
21
|
+
const manifestPath = String(value || '');
|
|
22
|
+
if (!manifestPath
|
|
23
|
+
|| manifestPath.includes('\\')
|
|
24
|
+
|| isAbsolute(manifestPath)
|
|
25
|
+
|| posix.isAbsolute(manifestPath)
|
|
26
|
+
|| posix.normalize(manifestPath) !== manifestPath
|
|
27
|
+
|| manifestPath.split('/').some(segment => !segment || segment === '.' || segment === '..')) {
|
|
28
|
+
fail('manifest-path-unsafe', manifestPath || '(empty)');
|
|
29
|
+
}
|
|
30
|
+
return manifestPath;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function collectOutputFiles(directory, webRoot, output = []) {
|
|
34
|
+
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
35
|
+
const fullPath = join(directory, entry.name);
|
|
36
|
+
if (entry.isDirectory()) {
|
|
37
|
+
collectOutputFiles(fullPath, webRoot, output);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (!entry.isFile()) fail('output-entry-not-file', relative(webRoot, fullPath));
|
|
41
|
+
const outputPath = relative(webRoot, fullPath).replaceAll('\\', '/');
|
|
42
|
+
if (outputPath !== EVIDENCE_FILE && !outputPath.endsWith('.tmp')) output.push(outputPath);
|
|
43
|
+
}
|
|
44
|
+
return output.sort((left, right) => left.localeCompare(right));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function validatePackagedWebOutput(webDirectory, expectedVersion) {
|
|
48
|
+
const webRoot = resolve(String(webDirectory || ''));
|
|
49
|
+
if (!webDirectory || !existsSync(webRoot)) fail('web-root-missing', webRoot);
|
|
50
|
+
const indexPath = join(webRoot, 'index.html');
|
|
51
|
+
const evidencePath = join(webRoot, EVIDENCE_FILE);
|
|
52
|
+
if (!existsSync(indexPath)) fail('index-missing', indexPath);
|
|
53
|
+
if (!existsSync(evidencePath)) fail('evidence-missing', evidencePath);
|
|
54
|
+
|
|
55
|
+
const evidence = readJson(evidencePath, 'evidence');
|
|
56
|
+
if (evidence?.schemaVersion !== 2) fail('evidence-schema', String(evidence?.schemaVersion));
|
|
57
|
+
if (evidence?.kind !== EVIDENCE_KIND) fail('evidence-kind', String(evidence?.kind));
|
|
58
|
+
if (!expectedVersion || evidence?.pwaRelease !== expectedVersion) {
|
|
59
|
+
fail('version-mismatch', `package=${expectedVersion || '(missing)'},web=${evidence?.pwaRelease || '(missing)'}`);
|
|
60
|
+
}
|
|
61
|
+
if (!Array.isArray(evidence.outputManifest) || evidence.outputManifest.length === 0) {
|
|
62
|
+
fail('manifest-empty');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const actualPaths = collectOutputFiles(webRoot, webRoot);
|
|
66
|
+
const recordedPaths = [];
|
|
67
|
+
const seenPaths = new Set();
|
|
68
|
+
const aggregateHash = createHash('sha256');
|
|
69
|
+
let outputBytes = 0;
|
|
70
|
+
|
|
71
|
+
for (const item of evidence.outputManifest) {
|
|
72
|
+
const outputPath = validateManifestPath(item?.path);
|
|
73
|
+
if (seenPaths.has(outputPath)) fail('manifest-path-duplicate', outputPath);
|
|
74
|
+
seenPaths.add(outputPath);
|
|
75
|
+
recordedPaths.push(outputPath);
|
|
76
|
+
if (!Number.isSafeInteger(item?.bytes) || item.bytes < 0) fail('manifest-size-invalid', outputPath);
|
|
77
|
+
if (!/^[a-f0-9]{64}$/.test(String(item?.sha256 || ''))) fail('manifest-hash-invalid', outputPath);
|
|
78
|
+
|
|
79
|
+
const filePath = resolve(webRoot, ...outputPath.split('/'));
|
|
80
|
+
const withinRoot = filePath.startsWith(`${webRoot}${sep}`);
|
|
81
|
+
if (!withinRoot) fail('manifest-path-unsafe', outputPath);
|
|
82
|
+
if (!existsSync(filePath) || !statSync(filePath).isFile()) fail('output-missing', outputPath);
|
|
83
|
+
const contents = readFileSync(filePath);
|
|
84
|
+
if (contents.byteLength !== item.bytes) fail('output-size-mismatch', outputPath);
|
|
85
|
+
const sha256 = createHash('sha256').update(contents).digest('hex');
|
|
86
|
+
if (sha256 !== item.sha256) fail('output-hash-mismatch', outputPath);
|
|
87
|
+
|
|
88
|
+
outputBytes += contents.byteLength;
|
|
89
|
+
aggregateHash.update(outputPath);
|
|
90
|
+
aggregateHash.update('\0');
|
|
91
|
+
aggregateHash.update(String(contents.byteLength));
|
|
92
|
+
aggregateHash.update('\0');
|
|
93
|
+
aggregateHash.update(contents);
|
|
94
|
+
aggregateHash.update('\0');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (!seenPaths.has('index.html')) fail('index-not-recorded');
|
|
98
|
+
if (JSON.stringify(recordedPaths) !== JSON.stringify(actualPaths)) fail('manifest-file-set-mismatch');
|
|
99
|
+
if (evidence.outputFileCount !== recordedPaths.length) fail('output-count-mismatch');
|
|
100
|
+
if (evidence.outputBytes !== outputBytes) fail('output-bytes-mismatch');
|
|
101
|
+
if (evidence.outputHash !== aggregateHash.digest('hex')) fail('output-aggregate-hash-mismatch');
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
webRoot,
|
|
105
|
+
version: expectedVersion,
|
|
106
|
+
outputFileCount: recordedPaths.length,
|
|
107
|
+
outputBytes
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function validatePackagedWeb(appDir) {
|
|
112
|
+
const packageRoot = resolve(String(appDir || ''));
|
|
113
|
+
if (!appDir || !existsSync(packageRoot)) fail('app-dir-missing', packageRoot);
|
|
114
|
+
const packageInfo = readJson(join(packageRoot, 'package.json'), 'package-json');
|
|
115
|
+
return {
|
|
116
|
+
appDir: packageRoot,
|
|
117
|
+
...validatePackagedWebOutput(join(packageRoot, 'web', 'dist'), packageInfo?.version)
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async function beforePack(context) {
|
|
122
|
+
const appDir = context?.packager?.info?.appDir;
|
|
123
|
+
const result = validatePackagedWeb(appDir);
|
|
124
|
+
console.log(`Verified packaged VuvoDesk web UI ${result.version}: ${result.outputFileCount} files, ${result.outputBytes} bytes.`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
module.exports = beforePack;
|
|
128
|
+
module.exports.validatePackagedWeb = validatePackagedWeb;
|
|
129
|
+
module.exports.validatePackagedWebOutput = validatePackagedWebOutput;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
appId: com.livedesk.desktop
|
|
2
2
|
productName: VuvoDesk
|
|
3
3
|
artifactName: VuvoDesk-${version}-${arch}.${ext}
|
|
4
|
-
asar: true
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
asar: true
|
|
5
|
+
beforePack: packages/livedesk/electron/before-pack.cjs
|
|
6
|
+
directories:
|
|
7
|
+
app: packages/livedesk
|
|
7
8
|
output: dist/desktop
|
package/package.json
CHANGED
package/web/dist/app.webmanifest
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LiveDeskApp-DtvEkJkj.js","assets/styles-BQJexgrQ.js","assets/icons-C9gCrfh8.js","assets/react-CzpJ4iNd.js","assets/styles-BNaoQWzp.css","assets/SupportPage-D4TV6Vpp.js","assets/App-B6lW0dqi.js","assets/supabase-C7qjtLN3.js","assets/App-CD73TEql.css","assets/SupportPage-Cxx61WwR.css","assets/DesktopUpdatePanel-_K61p838.js","assets/LiveDeskApp-ao5vkK6F.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{j as e,M as O,F as R,p as n,a as S,i as N,c as W,P as U,t as $,s as B,b as F,_ as H,r as G,d as q,e as K}from"./styles-BQJexgrQ.js";import{a as c,A as o,M as X,C as P,S as Y,E as D,b as k,c as A,L as b,T as g,d as u,e as C,f as v,W as J,R as Q,g as Z,D as l,N as E,h as ee,i as se,j as z,k as ie,G as M,l as ae}from"./icons-C9gCrfh8.js";import"./react-CzpJ4iNd.js";const ne="0.1.630",re={version:ne},le=String(re.version).trim(),L="npx -y --prefer-online livedesk@latest",j="https://livedesk-desktop-updates.lovecrdm.workers.dev/download/dev",ce=`${j}/windows/x64`,te=`${j}/macos/x64`,oe=`${j}/macos/arm64`,de=`${j}/linux/x64`,he=`${j}/linux/x64/deb`;function pe(){if(typeof window>"u")return"home";const i=window.location.pathname.replace(/\/+$/,"")||"/";return i==="/"?"home":i==="/download"?"download":i==="/pricing"?"pricing":"not-found"}function T(){return e.jsxs("a",{className:"site-brand",href:"/","aria-label":"VuvoDesk home",children:[e.jsx("span",{className:"site-brand-mark",children:e.jsx(O,{size:25})}),e.jsx("span",{children:"VuvoDesk"})]})}function xe({page:i}){const a=[{label:"Product",href:"/#product",active:i==="home"},{label:"Pricing",href:"/pricing",active:i==="pricing"},{label:"Download",href:"/download",active:i==="download"},{label:"Support",href:"/support",active:!1}];return e.jsx("header",{className:"site-header",children:e.jsxs("div",{className:"site-header-inner",children:[e.jsx(T,{}),e.jsx("nav",{className:"site-nav","aria-label":"Main navigation",children:a.map(s=>e.jsx("a",{className:s.active?"active":"",href:s.href,children:s.label},s.label))}),e.jsxs("div",{className:"site-header-actions",children:[e.jsx("a",{className:"site-text-link",href:"/app",children:"Open web console"}),e.jsxs("a",{className:"site-button site-button-small",href:"/download",children:["Get VuvoDesk ",e.jsx(o,{size:15})]})]}),e.jsxs("details",{className:"site-mobile-menu",children:[e.jsx("summary",{"aria-label":"Open navigation",children:e.jsx(X,{size:22})}),e.jsxs("nav",{"aria-label":"Mobile navigation",children:[a.map(s=>e.jsxs("a",{href:s.href,children:[s.label,e.jsx(P,{size:15})]},s.label)),e.jsxs("a",{href:"/app",children:["Open web console",e.jsx(P,{size:15})]})]})]})]})})}function je(){return e.jsxs("footer",{className:"site-footer",children:[e.jsxs("div",{className:"site-footer-main",children:[e.jsxs("div",{children:[e.jsx(T,{}),e.jsx("p",{children:"One calm command center for every computer you manage."})]}),e.jsxs("div",{className:"site-footer-links",children:[e.jsxs("div",{children:[e.jsx("strong",{children:"Product"}),e.jsx("a",{href:"/#product",children:"Overview"}),e.jsx("a",{href:"/pricing",children:"Pricing"}),e.jsx("a",{href:"/download",children:"Download"})]}),e.jsxs("div",{children:[e.jsx("strong",{children:"Use VuvoDesk"}),e.jsx("a",{href:"/app",children:"Web console"}),e.jsx("a",{href:"/support",children:"Support"})]}),e.jsxs("div",{children:[e.jsx("strong",{children:"Platforms"}),e.jsx("span",{children:"Windows"}),e.jsx("span",{children:"macOS"}),e.jsx("span",{children:"Linux"}),e.jsx("span",{children:"Mobile PWA"})]})]})]}),e.jsxs("div",{className:"site-footer-bottom",children:[e.jsx("span",{children:"© 2026 VuvoDesk"}),e.jsx("span",{children:"Built for people who run real work across many screens."})]})]})}function me(){const i=[{name:"Studio-01",status:"Online",className:"screen-blue",cpu:"42%",ram:"61%"},{name:"Render-Mac",status:"Online",className:"screen-purple",cpu:"67%",ram:"74%"},{name:"Linux-Build",status:"Online",className:"screen-green",cpu:"29%",ram:"48%"},{name:"Office-PC",status:"Idle",className:"screen-orange",cpu:"18%",ram:"37%"}];return e.jsxs("div",{className:"product-mockup","aria-label":"VuvoDesk screen wall preview",children:[e.jsxs("div",{className:"mockup-window-bar",children:[e.jsxs("div",{children:[e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{})]}),e.jsx("span",{children:"VuvoDesk · Wall"}),e.jsxs("span",{className:"mockup-online",children:[e.jsx("i",{})," 4 online"]})]}),e.jsxs("div",{className:"mockup-body",children:[e.jsxs("aside",{className:"mockup-rail","aria-hidden":"true",children:[e.jsx("span",{className:"active",children:e.jsx(C,{size:17})}),e.jsx("span",{children:e.jsx(v,{size:17})}),e.jsx("span",{children:e.jsx(E,{size:17})}),e.jsx("span",{children:e.jsx(M,{size:17})})]}),e.jsx("div",{className:"mockup-wall",children:i.map(a=>e.jsxs("article",{className:"mockup-screen",children:[e.jsxs("div",{className:`mockup-screen-image ${a.className}`,children:[e.jsx("span",{className:"mockup-code-line wide"}),e.jsx("span",{className:"mockup-code-line"}),e.jsx("span",{className:"mockup-code-line short"}),e.jsx("span",{className:"mockup-panel-block"})]}),e.jsxs("div",{className:"mockup-screen-title",children:[e.jsx("strong",{children:a.name}),e.jsxs("span",{children:[e.jsx("i",{})," ",a.status]})]}),e.jsxs("div",{className:"mockup-metrics",children:[e.jsxs("span",{children:["CPU ",e.jsx("b",{children:a.cpu})]}),e.jsxs("span",{children:["RAM ",e.jsx("b",{children:a.ram})]})]})]},a.name))})]}),e.jsxs("div",{className:"mockup-control-card",children:[e.jsx(v,{size:18}),e.jsxs("span",{children:[e.jsx("small",{children:"Selected computer"}),e.jsx("strong",{children:"Render-Mac"})]}),e.jsx("button",{type:"button",children:"Control"})]})]})}function V({compact:i=!1}){const a=[{key:"free",name:n.free.name,price:n.free.price,suffix:"forever",audience:n.free.audience,description:"A practical personal wall, supported by a standard banner.",features:[`Up to ${R} devices`,"Live wall and focused control","Standard banner"],action:"Start free",href:"/app"},{key:"plus",name:n.ltd.name,price:n.ltd.price,suffix:"/ month",audience:n.ltd.audience,description:"A clean personal command center for creators and homelabs.",features:[`Up to ${S} devices`,"No standard banner","Personal use"],ltd:n.ltd.ltd,action:"Choose Plus",href:"/app?view=pricing"},{key:"pro",name:n.pro.name,price:n.pro.price,suffix:"/ month",audience:n.pro.audience,description:"Commercial monitoring for studios, offices, and growing fleets.",features:[`More than ${S} Clients`,"Ad-free commercial use","Large screen walls"],ltd:n.pro.ltd,action:"Choose Pro",href:"/app?view=pricing"}];return e.jsx("div",{className:`site-pricing-grid ${i?"compact":""}`,children:a.map(s=>e.jsxs("article",{className:`site-price-card ${s.key==="plus"?"featured":""}`,children:[e.jsxs("div",{className:"site-price-heading",children:[e.jsx("span",{children:s.name}),s.key==="plus"&&e.jsx("em",{children:"Most popular"})]}),e.jsx("p",{className:"site-price-audience",children:s.audience}),e.jsxs("div",{className:"site-price",children:[e.jsx("strong",{children:s.price}),e.jsx("small",{children:s.suffix})]}),e.jsx("p",{children:s.description}),e.jsx("ul",{children:s.features.map(r=>e.jsxs("li",{children:[e.jsx(ae,{size:16})," ",r]},r))}),s.ltd&&e.jsxs("div",{className:"site-ltd",children:[e.jsxs("span",{children:[s.name," LTD"]}),e.jsx("strong",{children:s.ltd.replace(" LTD","")}),e.jsx("small",{children:"one-time · available now"})]}),e.jsxs("a",{className:`site-price-action ${s.key==="plus"?"primary":""}`,href:s.href,children:[s.action,e.jsx(o,{size:15})]})]},s.key))})}function ue(){return e.jsx(e.Fragment,{children:e.jsxs("main",{children:[e.jsxs("section",{className:"site-hero",children:[e.jsxs("div",{className:"site-hero-copy",children:[e.jsxs("span",{className:"site-kicker",children:[e.jsx(Y,{size:15})," The screen wall for real work"]}),e.jsxs("h1",{children:["Every computer.",e.jsx("br",{}),e.jsx("span",{children:"One calm command center."})]}),e.jsx("p",{children:"See every screen, focus the computer that needs you, and keep work moving from your desk or phone."}),e.jsxs("div",{className:"site-hero-actions",children:[e.jsxs("a",{className:"site-button",href:"/download",children:["Download VuvoDesk ",e.jsx(o,{size:17})]}),e.jsxs("a",{className:"site-button site-button-secondary",href:"/app",children:["Open web console ",e.jsx(D,{size:17})]})]}),e.jsxs("div",{className:"site-hero-notes",children:[e.jsxs("span",{children:[e.jsx(k,{size:15})," Free for 5 devices"]}),e.jsxs("span",{children:[e.jsx(k,{size:15})," No credit card"]}),e.jsxs("span",{children:[e.jsx(k,{size:15})," Windows · macOS · Linux"]})]})]}),e.jsxs("div",{className:"site-hero-visual",children:[e.jsx("div",{className:"site-orbit site-orbit-one"}),e.jsx("div",{className:"site-orbit site-orbit-two"}),e.jsx(me,{})]})]}),e.jsxs("section",{className:"platform-strip","aria-label":"Supported platforms",children:[e.jsx("span",{children:"Built for the computers you already run"}),e.jsxs("div",{children:[e.jsxs("strong",{children:[e.jsx(A,{size:18})," Windows"]}),e.jsxs("strong",{children:[e.jsx(b,{size:18})," macOS"]}),e.jsxs("strong",{children:[e.jsx(g,{size:18})," Linux"]}),e.jsxs("strong",{children:[e.jsx(u,{size:18})," iPhone & Android"]}),e.jsxs("strong",{children:[e.jsx(D,{size:18})," Any browser"]})]})]}),e.jsxs("section",{className:"site-section site-value-section",id:"product",children:[e.jsxs("div",{className:"site-section-heading",children:[e.jsx("span",{children:"Why VuvoDesk"}),e.jsxs("h2",{children:["Spend less time finding the problem.",e.jsx("br",{}),"Spend more time fixing it."]}),e.jsx("p",{children:"VuvoDesk keeps the fleet visible without turning your desktop into a pile of remote windows."})]}),e.jsxs("div",{className:"site-value-grid",children:[e.jsxs("article",{className:"site-value-card large blue",children:[e.jsx("span",{className:"site-feature-icon",children:e.jsx(C,{size:23})}),e.jsx("h3",{children:"A wall that stays readable"}),e.jsx("p",{children:"Move from a compact list to large live previews. Keep the signal you need and hide the noise you do not."}),e.jsxs("div",{className:"feature-wall-demo",children:[e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{})]})]}),e.jsxs("article",{className:"site-value-card mint",children:[e.jsx("span",{className:"site-feature-icon",children:e.jsx(v,{size:23})}),e.jsx("h3",{children:"Control without losing context"}),e.jsx("p",{children:"Jump from Wall to focused Control, then return to the same fleet view."}),e.jsxs("div",{className:"feature-cursor-demo",children:[e.jsx(v,{size:31}),e.jsx("span",{children:"Direct control"})]})]}),e.jsxs("article",{className:"site-value-card violet",children:[e.jsx("span",{className:"site-feature-icon",children:e.jsx(J,{size:23})}),e.jsx("h3",{children:"Your fleet in your pocket"}),e.jsx("p",{children:"Install the PWA on iPhone or Android and check the room before you walk back to it."}),e.jsxs("div",{className:"feature-phone-demo",children:[e.jsx("span",{}),e.jsxs("div",{children:[e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{})]})]})]}),e.jsxs("article",{className:"site-value-card wide dark",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"site-kicker dark",children:[e.jsx(Q,{size:14})," Local-first when possible"]}),e.jsx("h3",{children:"Fast where you work. Reachable when you leave."}),e.jsx("p",{children:"VuvoDesk prefers the shortest useful route and keeps the current screen moving instead of building a stale queue."})]}),e.jsxs("div",{className:"feature-route",children:[e.jsxs("span",{children:[e.jsx(b,{size:19})," Hub"]}),e.jsx("i",{}),e.jsxs("span",{children:[e.jsx(Z,{size:19})," Clients"]}),e.jsx("i",{}),e.jsxs("span",{children:[e.jsx(u,{size:19})," PWA"]})]})]})]})]}),e.jsxs("section",{className:"site-section site-workflow",children:[e.jsxs("div",{className:"site-section-heading centered",children:[e.jsx("span",{children:"Start in three steps"}),e.jsx("h2",{children:"From zero to a live wall in minutes."})]}),e.jsxs("div",{className:"workflow-grid",children:[e.jsxs("article",{children:[e.jsx("b",{children:"01"}),e.jsx("span",{children:e.jsx(l,{size:21})}),e.jsx("h3",{children:"Install the Hub"}),e.jsx("p",{children:"Choose the computer that will organize your VuvoDesk fleet."})]}),e.jsxs("article",{children:[e.jsx("b",{children:"02"}),e.jsx("span",{children:e.jsx(E,{size:21})}),e.jsx("h3",{children:"Connect Clients"}),e.jsx("p",{children:"Use one PIN to add the Windows, Mac, and Linux computers you manage."})]}),e.jsxs("article",{children:[e.jsx("b",{children:"03"}),e.jsx("span",{children:e.jsx(u,{size:21})}),e.jsx("h3",{children:"Manage from anywhere"}),e.jsx("p",{children:"Open the web console or install the mobile PWA and keep every screen close."})]})]})]}),e.jsxs("section",{className:"site-section site-pricing-section",children:[e.jsxs("div",{className:"site-section-heading centered",children:[e.jsx("span",{children:"Simple pricing"}),e.jsx("h2",{children:"Start free. Upgrade when the wall earns its place."}),e.jsx("p",{children:"Monthly prices stay easy to understand. Lifetime offers are available separately below each paid plan."})]}),e.jsx(V,{compact:!0}),e.jsxs("a",{className:"site-inline-link",href:"/pricing",children:["Compare every plan ",e.jsx(o,{size:15})]})]}),e.jsxs("section",{className:"site-final-cta",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"site-kicker dark",children:[e.jsx(ee,{size:14})," Your fleet, one glance away"]}),e.jsxs("h2",{children:["Give every computer",e.jsx("br",{}),"one clear place to report."]})]}),e.jsxs("div",{children:[e.jsx("p",{children:"Start with five devices for free. Install the Hub, connect a Client, and open your first live wall."}),e.jsxs("div",{children:[e.jsxs("a",{className:"site-button light",href:"/download",children:["Get VuvoDesk ",e.jsx(o,{size:17})]}),e.jsx("a",{className:"site-button ghost",href:"/app",children:"Open console"})]})]})]})]})})}function ve(){const[i,a]=c.useState(!1),s=async()=>{try{await navigator.clipboard.writeText(L),a(!0),window.setTimeout(()=>a(!1),1800)}catch{a(!1)}};return e.jsxs("main",{className:"site-subpage",children:[e.jsxs("section",{className:"site-subpage-hero download-hero",children:[e.jsxs("span",{className:"site-kicker",children:[e.jsx(l,{size:15})," Download VuvoDesk"]}),e.jsxs("h1",{children:["Turn one computer into",e.jsx("br",{}),e.jsx("span",{children:"your command center."})]}),e.jsx("p",{children:"Use the latest temporary installer for your computer. These preview links always follow the newest matching file published to the VuvoDesk download channel."})]}),e.jsxs("section",{className:"download-grid",children:[e.jsxs("article",{id:"windows",children:[e.jsx("span",{className:"download-platform-icon windows",children:e.jsx(A,{size:27})}),e.jsxs("div",{children:[e.jsx("small",{children:"Windows"}),e.jsx("span",{className:"download-version",children:"Latest temporary build · x64 Electron"}),e.jsx("span",{className:"download-preview-note",children:"Temporary installer · unsigned"}),e.jsx("h2",{children:"Install VuvoDesk for Windows"}),e.jsx("p",{children:"Download the normal Electron setup program. Windows SmartScreen may warn about this preview until code signing is ready."})]}),e.jsxs("a",{className:"download-installer-link",href:ce,children:["Download Windows installer ",e.jsx(l,{size:16})]})]}),e.jsxs("article",{id:"macos",children:[e.jsx("span",{className:"download-platform-icon mac",children:e.jsx(b,{size:27})}),e.jsxs("div",{children:[e.jsx("small",{children:"macOS"}),e.jsx("span",{className:"download-version",children:"Latest temporary build · Intel & Apple silicon"}),e.jsx("span",{className:"download-preview-note",children:"Temporary installer · ad-hoc signed · not notarized"}),e.jsx("h2",{children:"Install VuvoDesk for macOS"}),e.jsx("p",{children:"Choose the chip in your Mac. On first launch, macOS may require Open Anyway in Privacy & Security because this preview is not Apple-notarized."})]}),e.jsxs("div",{className:"download-actions",children:[e.jsxs("a",{className:"download-installer-link",href:oe,children:["Apple silicon ",e.jsx(l,{size:16})]}),e.jsxs("a",{className:"download-installer-link secondary",href:te,children:["Intel Mac ",e.jsx(l,{size:16})]})]})]}),e.jsxs("article",{id:"linux",children:[e.jsx("span",{className:"download-platform-icon linux",children:e.jsx(g,{size:27})}),e.jsxs("div",{children:[e.jsx("small",{children:"Linux"}),e.jsx("span",{className:"download-version",children:"Latest temporary build · x64 · X11"}),e.jsx("span",{className:"download-preview-note",children:"Temporary installer"}),e.jsx("h2",{children:"Install VuvoDesk for Linux"}),e.jsx("p",{children:"Use the DEB package on Ubuntu, Debian, or Mint. For other distributions, download AppImage, mark it executable, then open it."})]}),e.jsxs("div",{className:"download-actions",children:[e.jsxs("a",{className:"download-installer-link",href:he,children:["Download .deb ",e.jsx(l,{size:16})]}),e.jsxs("a",{className:"download-installer-link secondary",href:de,children:["Download AppImage ",e.jsx(l,{size:16})]})]})]})]}),e.jsxs("section",{className:"install-command-card",id:"install-command",children:[e.jsxs("div",{children:[e.jsxs("span",{children:[e.jsx(g,{size:18})," One command install"]}),e.jsx("h2",{children:"Terminal fallback and advanced setup"}),e.jsx("p",{children:"Use the npm package when you prefer a command-line install or the temporary desktop package does not suit your system."})]}),e.jsxs("div",{className:"install-command",children:[e.jsx("code",{children:L}),e.jsxs("button",{type:"button",onClick:()=>{s()},children:[e.jsx(se,{size:17})," ",i?"Copied":"Copy"]})]}),e.jsxs("ol",{children:[e.jsxs("li",{children:[e.jsx("b",{children:"1"}),e.jsx("span",{children:"Run the command on the computer that will be your Hub."})]}),e.jsxs("li",{children:[e.jsx("b",{children:"2"}),e.jsx("span",{children:"Open Settings and create a Hub PIN."})]}),e.jsxs("li",{children:[e.jsx("b",{children:"3"}),e.jsx("span",{children:"Run the same package as a Client on the other computers."})]})]})]}),e.jsxs("section",{className:"mobile-install-section",id:"mobile",children:[e.jsxs("div",{className:"mobile-install-heading",children:[e.jsx("span",{children:e.jsx(u,{size:26})}),e.jsxs("div",{children:[e.jsxs("small",{children:["iPhone & Android · PWA ",le]}),e.jsx("h2",{children:"No app store required."}),e.jsx("p",{children:"Open the public web address, sign in, then install VuvoDesk on the Home Screen. The PWA always starts directly in the console."})]})]}),e.jsxs("div",{className:"mobile-web-address",children:[e.jsx("span",{children:"Mobile web address"}),e.jsx("a",{href:"https://vuvodesk.com/app",children:"https://vuvodesk.com/app"}),e.jsxs("a",{className:"site-button",href:"/app",children:["Open mobile console ",e.jsx(o,{size:16})]})]}),e.jsxs("div",{className:"pwa-guide-grid",children:[e.jsxs("article",{children:[e.jsx("strong",{children:"iPhone & iPad"}),e.jsxs("ol",{children:[e.jsx("li",{children:"Open the address in Safari."}),e.jsx("li",{children:"Tap Share, then Add to Home Screen."}),e.jsx("li",{children:"Choose Open as Web App and add VuvoDesk."})]})]}),e.jsxs("article",{children:[e.jsx("strong",{children:"Android"}),e.jsxs("ol",{children:[e.jsx("li",{children:"Open the address in Chrome."}),e.jsx("li",{children:"Open the browser menu and tap Install app."}),e.jsx("li",{children:"Launch VuvoDesk from the Home Screen."})]})]})]})]})]})}function fe(){return e.jsxs("main",{className:"site-subpage pricing-subpage",children:[e.jsxs("section",{className:"site-subpage-hero",children:[e.jsxs("span",{className:"site-kicker",children:[e.jsx(z,{size:15})," VuvoDesk pricing"]}),e.jsxs("h1",{children:["Clear plans for",e.jsx("br",{}),e.jsx("span",{children:"growing screen walls."})]}),e.jsx("p",{children:"Use VuvoDesk free on five personal computers. Choose Plus for a larger ad-free personal wall, or Pro for commercial work."})]}),e.jsx(V,{}),e.jsxs("section",{className:"pricing-explainer",children:[e.jsxs("article",{children:[e.jsx(ie,{size:21}),e.jsxs("div",{children:[e.jsx("h3",{children:"Free stays useful"}),e.jsx("p",{children:"The standard banner helps keep a five-device personal wall available without a subscription."})]})]}),e.jsxs("article",{children:[e.jsx(z,{size:21}),e.jsxs("div",{children:[e.jsx("h3",{children:"Monthly and lifetime are separate"}),e.jsx("p",{children:"$5 and $15 are monthly plan prices. Plus LTD $79 and Pro LTD $199 are one-time offers shown separately."})]})]}),e.jsxs("article",{children:[e.jsx(M,{size:21}),e.jsxs("div",{children:[e.jsx("h3",{children:"Upgrade inside VuvoDesk"}),e.jsx("p",{children:"Sign in to the console, open Pricing, and choose the plan that matches the way you use the fleet."})]})]})]}),e.jsxs("section",{className:"pricing-bottom-cta",children:[e.jsxs("div",{children:[e.jsx("h2",{children:"Start with the computers you have today."}),e.jsx("p",{children:"No credit card is needed for Free."})]}),e.jsxs("a",{className:"site-button",href:"/app",children:["Start free ",e.jsx(o,{size:16})]})]})]})}function we(){return e.jsxs("main",{className:"site-not-found",children:[e.jsx("span",{className:"site-brand-mark",children:e.jsx(O,{size:25})}),e.jsx("small",{children:"404"}),e.jsx("h1",{children:"This screen is not on the wall."}),e.jsx("p",{children:"The page may have moved, but your VuvoDesk console is still here."}),e.jsxs("div",{children:[e.jsx("a",{className:"site-button",href:"/",children:"VuvoDesk home"}),e.jsx("a",{className:"site-button site-button-secondary",href:"/app",children:"Open console"})]})]})}function ke(){const i=pe();return c.useEffect(()=>{const a={home:"VuvoDesk — Every computer. One calm command center.",download:"Download VuvoDesk — Windows, macOS, and Linux",pricing:"VuvoDesk Pricing — Free, Plus, and Pro","not-found":"Page not found — VuvoDesk"};return document.title=a[i],document.documentElement.classList.add("livedesk-marketing-active"),()=>document.documentElement.classList.remove("livedesk-marketing-active")},[i]),e.jsxs("div",{className:"marketing-site",children:[e.jsx(xe,{page:i}),i==="home"?e.jsx(ue,{}):i==="download"?e.jsx(ve,{}):i==="pricing"?e.jsx(fe,{}):e.jsx(we,{}),e.jsx(je,{})]})}function Ne(i){return!!i.navigatorStandalone||!!i.displayModeStandalone||!!i.displayModeFullscreen}function be({publicOrigin:i,electron:a,pathname:s,search:r="",navigatorStandalone:f=!1,displayModeStandalone:p=!1,displayModeFullscreen:w=!1,marketingPreview:d=!1}){if(a||!i&&!d)return{kind:"app",redirectPath:""};const h=new URLSearchParams(r),x=h.has("pwa")||Ne({navigatorStandalone:f,displayModeStandalone:p,displayModeFullscreen:w}),m=s==="/app"||s.startsWith("/app/"),I=s==="/support"||s.startsWith("/support/"),_=h.has("checkout");return x||_?{kind:"app",redirectPath:m?"":"/app"}:m||I?{kind:"app",redirectPath:""}:{kind:"site",redirectPath:""}}function ge({automaticRetry:i}){const[a,s]=c.useState(null),[r,f]=c.useState(""),[p,w]=c.useState(!1);return c.useEffect(()=>{let d=!0;const h=window.setTimeout(()=>{d&&w(!0)},F);return H(()=>import("./LiveDeskApp-DtvEkJkj.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11])).then(x=>{d&&(window.clearTimeout(h),s(()=>x.LiveDeskApp))}).catch(x=>{if(!d)return;console.warn("[VuvoDesk] app startup load failed.",x),window.clearTimeout(h);const m=window.navigator.onLine?"The latest app file could not be loaded.":"Reconnect to the internet, then try again.";f(m),G("load-error",i)}),()=>{d=!1,window.clearTimeout(h)}},[i]),a?e.jsx(a,{}):r?e.jsx(q,{detail:r}):e.jsxs("main",{className:"runtime-role-boot","aria-label":"Starting VuvoDesk","aria-busy":"true",children:[e.jsx("span",{className:"runtime-role-boot-mark","aria-hidden":"true"}),e.jsx("strong",{children:p?"VuvoDesk is still loading":"Starting VuvoDesk"}),e.jsx("p",{children:p?"The latest app is taking longer than usual.":"Loading the current app..."}),p&&e.jsx("button",{type:"button",className:"runtime-role-boot-retry",onClick:K,children:"Reload latest"})]})}window.liveDesk&&document.documentElement.classList.add("livedesk-electron-desktop");const t=new URL(window.location.href),ye=!!window.navigator.standalone,y=be({publicOrigin:N(),electron:!!window.liveDesk,pathname:t.pathname,search:t.search,navigatorStandalone:ye,displayModeStandalone:window.matchMedia("(display-mode: standalone)").matches,displayModeFullscreen:window.matchMedia("(display-mode: fullscreen)").matches,marketingPreview:t.searchParams.get("site")==="1"});y.redirectPath&&(t.pathname=y.redirectPath,window.history.replaceState({},"",`${t.pathname}${t.search}${t.hash}`));W.createRoot(document.getElementById("root")).render(e.jsx(c.StrictMode,{children:y.kind==="site"?e.jsx(ke,{}):e.jsx(U,{automaticRetry:N(),children:e.jsx(ge,{automaticRetry:N()})})}));$();B();
|
|
2
|
+
import{j as e,M as O,F as R,p as n,a as S,i as N,c as W,P as U,t as $,s as B,b as F,_ as H,r as G,d as q,e as K}from"./styles-BQJexgrQ.js";import{a as c,A as o,M as X,C as P,S as Y,E as D,b as k,c as A,L as b,T as g,d as u,e as C,f as v,W as J,R as Q,g as Z,D as l,N as E,h as ee,i as se,j as z,k as ie,G as M,l as ae}from"./icons-C9gCrfh8.js";import"./react-CzpJ4iNd.js";const ne="0.1.631",re={version:ne},le=String(re.version).trim(),L="npx -y --prefer-online livedesk@latest",j="https://livedesk-desktop-updates.lovecrdm.workers.dev/download/dev",ce=`${j}/windows/x64`,te=`${j}/macos/x64`,oe=`${j}/macos/arm64`,de=`${j}/linux/x64`,he=`${j}/linux/x64/deb`;function pe(){if(typeof window>"u")return"home";const i=window.location.pathname.replace(/\/+$/,"")||"/";return i==="/"?"home":i==="/download"?"download":i==="/pricing"?"pricing":"not-found"}function T(){return e.jsxs("a",{className:"site-brand",href:"/","aria-label":"VuvoDesk home",children:[e.jsx("span",{className:"site-brand-mark",children:e.jsx(O,{size:25})}),e.jsx("span",{children:"VuvoDesk"})]})}function xe({page:i}){const a=[{label:"Product",href:"/#product",active:i==="home"},{label:"Pricing",href:"/pricing",active:i==="pricing"},{label:"Download",href:"/download",active:i==="download"},{label:"Support",href:"/support",active:!1}];return e.jsx("header",{className:"site-header",children:e.jsxs("div",{className:"site-header-inner",children:[e.jsx(T,{}),e.jsx("nav",{className:"site-nav","aria-label":"Main navigation",children:a.map(s=>e.jsx("a",{className:s.active?"active":"",href:s.href,children:s.label},s.label))}),e.jsxs("div",{className:"site-header-actions",children:[e.jsx("a",{className:"site-text-link",href:"/app",children:"Open web console"}),e.jsxs("a",{className:"site-button site-button-small",href:"/download",children:["Get VuvoDesk ",e.jsx(o,{size:15})]})]}),e.jsxs("details",{className:"site-mobile-menu",children:[e.jsx("summary",{"aria-label":"Open navigation",children:e.jsx(X,{size:22})}),e.jsxs("nav",{"aria-label":"Mobile navigation",children:[a.map(s=>e.jsxs("a",{href:s.href,children:[s.label,e.jsx(P,{size:15})]},s.label)),e.jsxs("a",{href:"/app",children:["Open web console",e.jsx(P,{size:15})]})]})]})]})})}function je(){return e.jsxs("footer",{className:"site-footer",children:[e.jsxs("div",{className:"site-footer-main",children:[e.jsxs("div",{children:[e.jsx(T,{}),e.jsx("p",{children:"One calm command center for every computer you manage."})]}),e.jsxs("div",{className:"site-footer-links",children:[e.jsxs("div",{children:[e.jsx("strong",{children:"Product"}),e.jsx("a",{href:"/#product",children:"Overview"}),e.jsx("a",{href:"/pricing",children:"Pricing"}),e.jsx("a",{href:"/download",children:"Download"})]}),e.jsxs("div",{children:[e.jsx("strong",{children:"Use VuvoDesk"}),e.jsx("a",{href:"/app",children:"Web console"}),e.jsx("a",{href:"/support",children:"Support"})]}),e.jsxs("div",{children:[e.jsx("strong",{children:"Platforms"}),e.jsx("span",{children:"Windows"}),e.jsx("span",{children:"macOS"}),e.jsx("span",{children:"Linux"}),e.jsx("span",{children:"Mobile PWA"})]})]})]}),e.jsxs("div",{className:"site-footer-bottom",children:[e.jsx("span",{children:"© 2026 VuvoDesk"}),e.jsx("span",{children:"Built for people who run real work across many screens."})]})]})}function me(){const i=[{name:"Studio-01",status:"Online",className:"screen-blue",cpu:"42%",ram:"61%"},{name:"Render-Mac",status:"Online",className:"screen-purple",cpu:"67%",ram:"74%"},{name:"Linux-Build",status:"Online",className:"screen-green",cpu:"29%",ram:"48%"},{name:"Office-PC",status:"Idle",className:"screen-orange",cpu:"18%",ram:"37%"}];return e.jsxs("div",{className:"product-mockup","aria-label":"VuvoDesk screen wall preview",children:[e.jsxs("div",{className:"mockup-window-bar",children:[e.jsxs("div",{children:[e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{})]}),e.jsx("span",{children:"VuvoDesk · Wall"}),e.jsxs("span",{className:"mockup-online",children:[e.jsx("i",{})," 4 online"]})]}),e.jsxs("div",{className:"mockup-body",children:[e.jsxs("aside",{className:"mockup-rail","aria-hidden":"true",children:[e.jsx("span",{className:"active",children:e.jsx(C,{size:17})}),e.jsx("span",{children:e.jsx(v,{size:17})}),e.jsx("span",{children:e.jsx(E,{size:17})}),e.jsx("span",{children:e.jsx(M,{size:17})})]}),e.jsx("div",{className:"mockup-wall",children:i.map(a=>e.jsxs("article",{className:"mockup-screen",children:[e.jsxs("div",{className:`mockup-screen-image ${a.className}`,children:[e.jsx("span",{className:"mockup-code-line wide"}),e.jsx("span",{className:"mockup-code-line"}),e.jsx("span",{className:"mockup-code-line short"}),e.jsx("span",{className:"mockup-panel-block"})]}),e.jsxs("div",{className:"mockup-screen-title",children:[e.jsx("strong",{children:a.name}),e.jsxs("span",{children:[e.jsx("i",{})," ",a.status]})]}),e.jsxs("div",{className:"mockup-metrics",children:[e.jsxs("span",{children:["CPU ",e.jsx("b",{children:a.cpu})]}),e.jsxs("span",{children:["RAM ",e.jsx("b",{children:a.ram})]})]})]},a.name))})]}),e.jsxs("div",{className:"mockup-control-card",children:[e.jsx(v,{size:18}),e.jsxs("span",{children:[e.jsx("small",{children:"Selected computer"}),e.jsx("strong",{children:"Render-Mac"})]}),e.jsx("button",{type:"button",children:"Control"})]})]})}function V({compact:i=!1}){const a=[{key:"free",name:n.free.name,price:n.free.price,suffix:"forever",audience:n.free.audience,description:"A practical personal wall, supported by a standard banner.",features:[`Up to ${R} devices`,"Live wall and focused control","Standard banner"],action:"Start free",href:"/app"},{key:"plus",name:n.ltd.name,price:n.ltd.price,suffix:"/ month",audience:n.ltd.audience,description:"A clean personal command center for creators and homelabs.",features:[`Up to ${S} devices`,"No standard banner","Personal use"],ltd:n.ltd.ltd,action:"Choose Plus",href:"/app?view=pricing"},{key:"pro",name:n.pro.name,price:n.pro.price,suffix:"/ month",audience:n.pro.audience,description:"Commercial monitoring for studios, offices, and growing fleets.",features:[`More than ${S} Clients`,"Ad-free commercial use","Large screen walls"],ltd:n.pro.ltd,action:"Choose Pro",href:"/app?view=pricing"}];return e.jsx("div",{className:`site-pricing-grid ${i?"compact":""}`,children:a.map(s=>e.jsxs("article",{className:`site-price-card ${s.key==="plus"?"featured":""}`,children:[e.jsxs("div",{className:"site-price-heading",children:[e.jsx("span",{children:s.name}),s.key==="plus"&&e.jsx("em",{children:"Most popular"})]}),e.jsx("p",{className:"site-price-audience",children:s.audience}),e.jsxs("div",{className:"site-price",children:[e.jsx("strong",{children:s.price}),e.jsx("small",{children:s.suffix})]}),e.jsx("p",{children:s.description}),e.jsx("ul",{children:s.features.map(r=>e.jsxs("li",{children:[e.jsx(ae,{size:16})," ",r]},r))}),s.ltd&&e.jsxs("div",{className:"site-ltd",children:[e.jsxs("span",{children:[s.name," LTD"]}),e.jsx("strong",{children:s.ltd.replace(" LTD","")}),e.jsx("small",{children:"one-time · available now"})]}),e.jsxs("a",{className:`site-price-action ${s.key==="plus"?"primary":""}`,href:s.href,children:[s.action,e.jsx(o,{size:15})]})]},s.key))})}function ue(){return e.jsx(e.Fragment,{children:e.jsxs("main",{children:[e.jsxs("section",{className:"site-hero",children:[e.jsxs("div",{className:"site-hero-copy",children:[e.jsxs("span",{className:"site-kicker",children:[e.jsx(Y,{size:15})," The screen wall for real work"]}),e.jsxs("h1",{children:["Every computer.",e.jsx("br",{}),e.jsx("span",{children:"One calm command center."})]}),e.jsx("p",{children:"See every screen, focus the computer that needs you, and keep work moving from your desk or phone."}),e.jsxs("div",{className:"site-hero-actions",children:[e.jsxs("a",{className:"site-button",href:"/download",children:["Download VuvoDesk ",e.jsx(o,{size:17})]}),e.jsxs("a",{className:"site-button site-button-secondary",href:"/app",children:["Open web console ",e.jsx(D,{size:17})]})]}),e.jsxs("div",{className:"site-hero-notes",children:[e.jsxs("span",{children:[e.jsx(k,{size:15})," Free for 5 devices"]}),e.jsxs("span",{children:[e.jsx(k,{size:15})," No credit card"]}),e.jsxs("span",{children:[e.jsx(k,{size:15})," Windows · macOS · Linux"]})]})]}),e.jsxs("div",{className:"site-hero-visual",children:[e.jsx("div",{className:"site-orbit site-orbit-one"}),e.jsx("div",{className:"site-orbit site-orbit-two"}),e.jsx(me,{})]})]}),e.jsxs("section",{className:"platform-strip","aria-label":"Supported platforms",children:[e.jsx("span",{children:"Built for the computers you already run"}),e.jsxs("div",{children:[e.jsxs("strong",{children:[e.jsx(A,{size:18})," Windows"]}),e.jsxs("strong",{children:[e.jsx(b,{size:18})," macOS"]}),e.jsxs("strong",{children:[e.jsx(g,{size:18})," Linux"]}),e.jsxs("strong",{children:[e.jsx(u,{size:18})," iPhone & Android"]}),e.jsxs("strong",{children:[e.jsx(D,{size:18})," Any browser"]})]})]}),e.jsxs("section",{className:"site-section site-value-section",id:"product",children:[e.jsxs("div",{className:"site-section-heading",children:[e.jsx("span",{children:"Why VuvoDesk"}),e.jsxs("h2",{children:["Spend less time finding the problem.",e.jsx("br",{}),"Spend more time fixing it."]}),e.jsx("p",{children:"VuvoDesk keeps the fleet visible without turning your desktop into a pile of remote windows."})]}),e.jsxs("div",{className:"site-value-grid",children:[e.jsxs("article",{className:"site-value-card large blue",children:[e.jsx("span",{className:"site-feature-icon",children:e.jsx(C,{size:23})}),e.jsx("h3",{children:"A wall that stays readable"}),e.jsx("p",{children:"Move from a compact list to large live previews. Keep the signal you need and hide the noise you do not."}),e.jsxs("div",{className:"feature-wall-demo",children:[e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{})]})]}),e.jsxs("article",{className:"site-value-card mint",children:[e.jsx("span",{className:"site-feature-icon",children:e.jsx(v,{size:23})}),e.jsx("h3",{children:"Control without losing context"}),e.jsx("p",{children:"Jump from Wall to focused Control, then return to the same fleet view."}),e.jsxs("div",{className:"feature-cursor-demo",children:[e.jsx(v,{size:31}),e.jsx("span",{children:"Direct control"})]})]}),e.jsxs("article",{className:"site-value-card violet",children:[e.jsx("span",{className:"site-feature-icon",children:e.jsx(J,{size:23})}),e.jsx("h3",{children:"Your fleet in your pocket"}),e.jsx("p",{children:"Install the PWA on iPhone or Android and check the room before you walk back to it."}),e.jsxs("div",{className:"feature-phone-demo",children:[e.jsx("span",{}),e.jsxs("div",{children:[e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{})]})]})]}),e.jsxs("article",{className:"site-value-card wide dark",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"site-kicker dark",children:[e.jsx(Q,{size:14})," Local-first when possible"]}),e.jsx("h3",{children:"Fast where you work. Reachable when you leave."}),e.jsx("p",{children:"VuvoDesk prefers the shortest useful route and keeps the current screen moving instead of building a stale queue."})]}),e.jsxs("div",{className:"feature-route",children:[e.jsxs("span",{children:[e.jsx(b,{size:19})," Hub"]}),e.jsx("i",{}),e.jsxs("span",{children:[e.jsx(Z,{size:19})," Clients"]}),e.jsx("i",{}),e.jsxs("span",{children:[e.jsx(u,{size:19})," PWA"]})]})]})]})]}),e.jsxs("section",{className:"site-section site-workflow",children:[e.jsxs("div",{className:"site-section-heading centered",children:[e.jsx("span",{children:"Start in three steps"}),e.jsx("h2",{children:"From zero to a live wall in minutes."})]}),e.jsxs("div",{className:"workflow-grid",children:[e.jsxs("article",{children:[e.jsx("b",{children:"01"}),e.jsx("span",{children:e.jsx(l,{size:21})}),e.jsx("h3",{children:"Install the Hub"}),e.jsx("p",{children:"Choose the computer that will organize your VuvoDesk fleet."})]}),e.jsxs("article",{children:[e.jsx("b",{children:"02"}),e.jsx("span",{children:e.jsx(E,{size:21})}),e.jsx("h3",{children:"Connect Clients"}),e.jsx("p",{children:"Use one PIN to add the Windows, Mac, and Linux computers you manage."})]}),e.jsxs("article",{children:[e.jsx("b",{children:"03"}),e.jsx("span",{children:e.jsx(u,{size:21})}),e.jsx("h3",{children:"Manage from anywhere"}),e.jsx("p",{children:"Open the web console or install the mobile PWA and keep every screen close."})]})]})]}),e.jsxs("section",{className:"site-section site-pricing-section",children:[e.jsxs("div",{className:"site-section-heading centered",children:[e.jsx("span",{children:"Simple pricing"}),e.jsx("h2",{children:"Start free. Upgrade when the wall earns its place."}),e.jsx("p",{children:"Monthly prices stay easy to understand. Lifetime offers are available separately below each paid plan."})]}),e.jsx(V,{compact:!0}),e.jsxs("a",{className:"site-inline-link",href:"/pricing",children:["Compare every plan ",e.jsx(o,{size:15})]})]}),e.jsxs("section",{className:"site-final-cta",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"site-kicker dark",children:[e.jsx(ee,{size:14})," Your fleet, one glance away"]}),e.jsxs("h2",{children:["Give every computer",e.jsx("br",{}),"one clear place to report."]})]}),e.jsxs("div",{children:[e.jsx("p",{children:"Start with five devices for free. Install the Hub, connect a Client, and open your first live wall."}),e.jsxs("div",{children:[e.jsxs("a",{className:"site-button light",href:"/download",children:["Get VuvoDesk ",e.jsx(o,{size:17})]}),e.jsx("a",{className:"site-button ghost",href:"/app",children:"Open console"})]})]})]})]})})}function ve(){const[i,a]=c.useState(!1),s=async()=>{try{await navigator.clipboard.writeText(L),a(!0),window.setTimeout(()=>a(!1),1800)}catch{a(!1)}};return e.jsxs("main",{className:"site-subpage",children:[e.jsxs("section",{className:"site-subpage-hero download-hero",children:[e.jsxs("span",{className:"site-kicker",children:[e.jsx(l,{size:15})," Download VuvoDesk"]}),e.jsxs("h1",{children:["Turn one computer into",e.jsx("br",{}),e.jsx("span",{children:"your command center."})]}),e.jsx("p",{children:"Use the latest temporary installer for your computer. These preview links always follow the newest matching file published to the VuvoDesk download channel."})]}),e.jsxs("section",{className:"download-grid",children:[e.jsxs("article",{id:"windows",children:[e.jsx("span",{className:"download-platform-icon windows",children:e.jsx(A,{size:27})}),e.jsxs("div",{children:[e.jsx("small",{children:"Windows"}),e.jsx("span",{className:"download-version",children:"Latest temporary build · x64 Electron"}),e.jsx("span",{className:"download-preview-note",children:"Temporary installer · unsigned"}),e.jsx("h2",{children:"Install VuvoDesk for Windows"}),e.jsx("p",{children:"Download the normal Electron setup program. Windows SmartScreen may warn about this preview until code signing is ready."})]}),e.jsxs("a",{className:"download-installer-link",href:ce,children:["Download Windows installer ",e.jsx(l,{size:16})]})]}),e.jsxs("article",{id:"macos",children:[e.jsx("span",{className:"download-platform-icon mac",children:e.jsx(b,{size:27})}),e.jsxs("div",{children:[e.jsx("small",{children:"macOS"}),e.jsx("span",{className:"download-version",children:"Latest temporary build · Intel & Apple silicon"}),e.jsx("span",{className:"download-preview-note",children:"Temporary installer · ad-hoc signed · not notarized"}),e.jsx("h2",{children:"Install VuvoDesk for macOS"}),e.jsx("p",{children:"Choose the chip in your Mac. On first launch, macOS may require Open Anyway in Privacy & Security because this preview is not Apple-notarized."})]}),e.jsxs("div",{className:"download-actions",children:[e.jsxs("a",{className:"download-installer-link",href:oe,children:["Apple silicon ",e.jsx(l,{size:16})]}),e.jsxs("a",{className:"download-installer-link secondary",href:te,children:["Intel Mac ",e.jsx(l,{size:16})]})]})]}),e.jsxs("article",{id:"linux",children:[e.jsx("span",{className:"download-platform-icon linux",children:e.jsx(g,{size:27})}),e.jsxs("div",{children:[e.jsx("small",{children:"Linux"}),e.jsx("span",{className:"download-version",children:"Latest temporary build · x64 · X11"}),e.jsx("span",{className:"download-preview-note",children:"Temporary installer"}),e.jsx("h2",{children:"Install VuvoDesk for Linux"}),e.jsx("p",{children:"Use the DEB package on Ubuntu, Debian, or Mint. For other distributions, download AppImage, mark it executable, then open it."})]}),e.jsxs("div",{className:"download-actions",children:[e.jsxs("a",{className:"download-installer-link",href:he,children:["Download .deb ",e.jsx(l,{size:16})]}),e.jsxs("a",{className:"download-installer-link secondary",href:de,children:["Download AppImage ",e.jsx(l,{size:16})]})]})]})]}),e.jsxs("section",{className:"install-command-card",id:"install-command",children:[e.jsxs("div",{children:[e.jsxs("span",{children:[e.jsx(g,{size:18})," One command install"]}),e.jsx("h2",{children:"Terminal fallback and advanced setup"}),e.jsx("p",{children:"Use the npm package when you prefer a command-line install or the temporary desktop package does not suit your system."})]}),e.jsxs("div",{className:"install-command",children:[e.jsx("code",{children:L}),e.jsxs("button",{type:"button",onClick:()=>{s()},children:[e.jsx(se,{size:17})," ",i?"Copied":"Copy"]})]}),e.jsxs("ol",{children:[e.jsxs("li",{children:[e.jsx("b",{children:"1"}),e.jsx("span",{children:"Run the command on the computer that will be your Hub."})]}),e.jsxs("li",{children:[e.jsx("b",{children:"2"}),e.jsx("span",{children:"Open Settings and create a Hub PIN."})]}),e.jsxs("li",{children:[e.jsx("b",{children:"3"}),e.jsx("span",{children:"Run the same package as a Client on the other computers."})]})]})]}),e.jsxs("section",{className:"mobile-install-section",id:"mobile",children:[e.jsxs("div",{className:"mobile-install-heading",children:[e.jsx("span",{children:e.jsx(u,{size:26})}),e.jsxs("div",{children:[e.jsxs("small",{children:["iPhone & Android · PWA ",le]}),e.jsx("h2",{children:"No app store required."}),e.jsx("p",{children:"Open the public web address, sign in, then install VuvoDesk on the Home Screen. The PWA always starts directly in the console."})]})]}),e.jsxs("div",{className:"mobile-web-address",children:[e.jsx("span",{children:"Mobile web address"}),e.jsx("a",{href:"https://vuvodesk.com/app",children:"https://vuvodesk.com/app"}),e.jsxs("a",{className:"site-button",href:"/app",children:["Open mobile console ",e.jsx(o,{size:16})]})]}),e.jsxs("div",{className:"pwa-guide-grid",children:[e.jsxs("article",{children:[e.jsx("strong",{children:"iPhone & iPad"}),e.jsxs("ol",{children:[e.jsx("li",{children:"Open the address in Safari."}),e.jsx("li",{children:"Tap Share, then Add to Home Screen."}),e.jsx("li",{children:"Choose Open as Web App and add VuvoDesk."})]})]}),e.jsxs("article",{children:[e.jsx("strong",{children:"Android"}),e.jsxs("ol",{children:[e.jsx("li",{children:"Open the address in Chrome."}),e.jsx("li",{children:"Open the browser menu and tap Install app."}),e.jsx("li",{children:"Launch VuvoDesk from the Home Screen."})]})]})]})]})]})}function fe(){return e.jsxs("main",{className:"site-subpage pricing-subpage",children:[e.jsxs("section",{className:"site-subpage-hero",children:[e.jsxs("span",{className:"site-kicker",children:[e.jsx(z,{size:15})," VuvoDesk pricing"]}),e.jsxs("h1",{children:["Clear plans for",e.jsx("br",{}),e.jsx("span",{children:"growing screen walls."})]}),e.jsx("p",{children:"Use VuvoDesk free on five personal computers. Choose Plus for a larger ad-free personal wall, or Pro for commercial work."})]}),e.jsx(V,{}),e.jsxs("section",{className:"pricing-explainer",children:[e.jsxs("article",{children:[e.jsx(ie,{size:21}),e.jsxs("div",{children:[e.jsx("h3",{children:"Free stays useful"}),e.jsx("p",{children:"The standard banner helps keep a five-device personal wall available without a subscription."})]})]}),e.jsxs("article",{children:[e.jsx(z,{size:21}),e.jsxs("div",{children:[e.jsx("h3",{children:"Monthly and lifetime are separate"}),e.jsx("p",{children:"$5 and $15 are monthly plan prices. Plus LTD $79 and Pro LTD $199 are one-time offers shown separately."})]})]}),e.jsxs("article",{children:[e.jsx(M,{size:21}),e.jsxs("div",{children:[e.jsx("h3",{children:"Upgrade inside VuvoDesk"}),e.jsx("p",{children:"Sign in to the console, open Pricing, and choose the plan that matches the way you use the fleet."})]})]})]}),e.jsxs("section",{className:"pricing-bottom-cta",children:[e.jsxs("div",{children:[e.jsx("h2",{children:"Start with the computers you have today."}),e.jsx("p",{children:"No credit card is needed for Free."})]}),e.jsxs("a",{className:"site-button",href:"/app",children:["Start free ",e.jsx(o,{size:16})]})]})]})}function we(){return e.jsxs("main",{className:"site-not-found",children:[e.jsx("span",{className:"site-brand-mark",children:e.jsx(O,{size:25})}),e.jsx("small",{children:"404"}),e.jsx("h1",{children:"This screen is not on the wall."}),e.jsx("p",{children:"The page may have moved, but your VuvoDesk console is still here."}),e.jsxs("div",{children:[e.jsx("a",{className:"site-button",href:"/",children:"VuvoDesk home"}),e.jsx("a",{className:"site-button site-button-secondary",href:"/app",children:"Open console"})]})]})}function ke(){const i=pe();return c.useEffect(()=>{const a={home:"VuvoDesk — Every computer. One calm command center.",download:"Download VuvoDesk — Windows, macOS, and Linux",pricing:"VuvoDesk Pricing — Free, Plus, and Pro","not-found":"Page not found — VuvoDesk"};return document.title=a[i],document.documentElement.classList.add("livedesk-marketing-active"),()=>document.documentElement.classList.remove("livedesk-marketing-active")},[i]),e.jsxs("div",{className:"marketing-site",children:[e.jsx(xe,{page:i}),i==="home"?e.jsx(ue,{}):i==="download"?e.jsx(ve,{}):i==="pricing"?e.jsx(fe,{}):e.jsx(we,{}),e.jsx(je,{})]})}function Ne(i){return!!i.navigatorStandalone||!!i.displayModeStandalone||!!i.displayModeFullscreen}function be({publicOrigin:i,electron:a,pathname:s,search:r="",navigatorStandalone:f=!1,displayModeStandalone:p=!1,displayModeFullscreen:w=!1,marketingPreview:d=!1}){if(a||!i&&!d)return{kind:"app",redirectPath:""};const h=new URLSearchParams(r),x=h.has("pwa")||Ne({navigatorStandalone:f,displayModeStandalone:p,displayModeFullscreen:w}),m=s==="/app"||s.startsWith("/app/"),I=s==="/support"||s.startsWith("/support/"),_=h.has("checkout");return x||_?{kind:"app",redirectPath:m?"":"/app"}:m||I?{kind:"app",redirectPath:""}:{kind:"site",redirectPath:""}}function ge({automaticRetry:i}){const[a,s]=c.useState(null),[r,f]=c.useState(""),[p,w]=c.useState(!1);return c.useEffect(()=>{let d=!0;const h=window.setTimeout(()=>{d&&w(!0)},F);return H(()=>import("./LiveDeskApp-DtvEkJkj.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11])).then(x=>{d&&(window.clearTimeout(h),s(()=>x.LiveDeskApp))}).catch(x=>{if(!d)return;console.warn("[VuvoDesk] app startup load failed.",x),window.clearTimeout(h);const m=window.navigator.onLine?"The latest app file could not be loaded.":"Reconnect to the internet, then try again.";f(m),G("load-error",i)}),()=>{d=!1,window.clearTimeout(h)}},[i]),a?e.jsx(a,{}):r?e.jsx(q,{detail:r}):e.jsxs("main",{className:"runtime-role-boot","aria-label":"Starting VuvoDesk","aria-busy":"true",children:[e.jsx("span",{className:"runtime-role-boot-mark","aria-hidden":"true"}),e.jsx("strong",{children:p?"VuvoDesk is still loading":"Starting VuvoDesk"}),e.jsx("p",{children:p?"The latest app is taking longer than usual.":"Loading the current app..."}),p&&e.jsx("button",{type:"button",className:"runtime-role-boot-retry",onClick:K,children:"Reload latest"})]})}window.liveDesk&&document.documentElement.classList.add("livedesk-electron-desktop");const t=new URL(window.location.href),ye=!!window.navigator.standalone,y=be({publicOrigin:N(),electron:!!window.liveDesk,pathname:t.pathname,search:t.search,navigatorStandalone:ye,displayModeStandalone:window.matchMedia("(display-mode: standalone)").matches,displayModeFullscreen:window.matchMedia("(display-mode: fullscreen)").matches,marketingPreview:t.searchParams.get("site")==="1"});y.redirectPath&&(t.pathname=y.redirectPath,window.history.replaceState({},"",`${t.pathname}${t.search}${t.hash}`));W.createRoot(document.getElementById("root")).render(e.jsx(c.StrictMode,{children:y.kind==="site"?e.jsx(ke,{}):e.jsx(U,{automaticRetry:N(),children:e.jsx(ge,{automaticRetry:N()})})}));$();B();
|
package/web/dist/index.html
CHANGED
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
.vuvodesk-static-boot button[hidden] { display: none; }
|
|
56
56
|
@keyframes vuvodesk-static-boot-spin { to { transform: rotate(360deg); } }
|
|
57
57
|
</style>
|
|
58
|
-
<script type="module" crossorigin src="/assets/main-
|
|
58
|
+
<script type="module" crossorigin src="/assets/main-DvaMzUeB.js"></script>
|
|
59
59
|
<link rel="modulepreload" crossorigin href="/assets/icons-C9gCrfh8.js">
|
|
60
60
|
<link rel="modulepreload" crossorigin href="/assets/react-CzpJ4iNd.js">
|
|
61
61
|
<link rel="modulepreload" crossorigin href="/assets/styles-BQJexgrQ.js">
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"kind": "livedesk-production-web-source-evidence",
|
|
4
|
-
"generatedAt": "2026-08-
|
|
5
|
-
"pwaRelease": "0.1.
|
|
6
|
-
"sourceHash": "
|
|
4
|
+
"generatedAt": "2026-08-27T02:46:25.181Z",
|
|
5
|
+
"pwaRelease": "0.1.631",
|
|
6
|
+
"sourceHash": "882965a524b5b13f043a950dccd794eba23797d5456c6aef5fa9ea21993d30dd",
|
|
7
7
|
"sourceFileCount": 175,
|
|
8
|
-
"sourceBytes":
|
|
8
|
+
"sourceBytes": 2549816,
|
|
9
9
|
"viteEnvironmentHash": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945",
|
|
10
|
-
"outputHash": "
|
|
10
|
+
"outputHash": "a5d8105d1995213fcc365735aa73c7fb069fbaa5aa92edac9c47c694462e1cf6",
|
|
11
11
|
"outputFileCount": 37,
|
|
12
12
|
"outputBytes": 1763705,
|
|
13
13
|
"outputManifest": [
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
{
|
|
25
25
|
"path": "app.webmanifest",
|
|
26
26
|
"bytes": 841,
|
|
27
|
-
"sha256": "
|
|
27
|
+
"sha256": "34e0bffbc3fdbbbc7af9a38e09cdb82b141c27200e41e8d86f432c9f4a7f7ad3"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"path": "apple-touch-icon.png",
|
|
@@ -92,9 +92,9 @@
|
|
|
92
92
|
"sha256": "0816549fff7fb01651830b196b138a857a3028f7105167ae458e29b3c62dc4c5"
|
|
93
93
|
},
|
|
94
94
|
{
|
|
95
|
-
"path": "assets/main-
|
|
95
|
+
"path": "assets/main-DvaMzUeB.js",
|
|
96
96
|
"bytes": 24815,
|
|
97
|
-
"sha256": "
|
|
97
|
+
"sha256": "3e928a50c8f2b3f40b3d1d1270af6d9b4b77ffb553e4f68d325926dbd6cec707"
|
|
98
98
|
},
|
|
99
99
|
{
|
|
100
100
|
"path": "assets/react-CzpJ4iNd.js",
|
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
{
|
|
170
170
|
"path": "index.html",
|
|
171
171
|
"bytes": 6130,
|
|
172
|
-
"sha256": "
|
|
172
|
+
"sha256": "45927d3577e7e0c9974df267121da1f339ee45a72c22fc55b75874b36f2e5043"
|
|
173
173
|
},
|
|
174
174
|
{
|
|
175
175
|
"path": "offline.html",
|
|
@@ -194,7 +194,7 @@
|
|
|
194
194
|
{
|
|
195
195
|
"path": "sw.js",
|
|
196
196
|
"bytes": 1460,
|
|
197
|
-
"sha256": "
|
|
197
|
+
"sha256": "ad162c949c7a3de847f1b07b4357e7d1b9f7ec64990791333f244c11ef7208c6"
|
|
198
198
|
}
|
|
199
199
|
]
|
|
200
200
|
}
|
package/web/dist/sw.js
CHANGED