DeskVNC DeskVNC

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>DeskVNC by the numbers: live GitHub API figures</title> <meta name="description" content="DeskVNC measured from the GitHub API: 70 stars, 8 forks, 26 releases, 1,040 release asset downloads, 225 commits on main and 10,022,989 bytes of source. Cumulative releases over time, commit cadence per day and the language breakdown, all plotted from live data."> <link rel="canonical" href="https://deskvnc-hub.pages.dev/by-the-numbers.html"> <meta property="og:type" content="article"> <meta property="og:site_name" content="DeskVNC"> <meta property="og:locale" content="en"> <meta property="og:title" content="DeskVNC by the numbers: live GitHub API figures"> <meta property="og:description" content="Stars, forks, releases, downloads, commits and the language breakdown, pulled live from the GitHub API for psmux/DeskVNC and plotted as charts."> <meta property="og:url" content="https://deskvnc-hub.pages.dev/by-the-numbers.html"> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="DeskVNC by the numbers: live GitHub API figures"> <meta name="twitter:description" content="The adoption numbers for DeskVNC, measured from the GitHub API and plotted."> <meta name="theme-color" content="#fbfcfd" media="(prefers-color-scheme: light)"> <meta name="theme-color" content="#0c0f13" media="(prefers-color-scheme: dark)"> <link rel="icon" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAzMiAzMic+PHJlY3Qgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyByeD0nNicgZmlsbD0nJTIzMGE1OGMyJy8+PHBhdGggZD0nTTggMTFoMTZNOCAxNmgxMU04IDIxaDcnIHN0cm9rZT0nJTIzZmZmZmZmJyBzdHJva2Utd2lkdGg9JzIuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8+PC9zdmc+"> <style> /* ========================================================================== DeskVNC hub, shared stylesheet.

One design system, four pages. Every visual value below resolves to a token declared at the top of this file. If a page needs a colour, a space or a size that is not here, the token gets added here first.

Color Light and dark pairs from prefers-color-scheme. One ink with two muted steps, one accent used sparingly, one focus ring that stays visible in both themes, one signal colour for verified material. Type System stacks only, so the pages make zero network requests. 1.2 modular scale. Mono is reserved for code, labels and metrics. Space 4px base scale, --space-1 through --space-9. Shape Tight radii and 1px rules. An instrument, not a poster. Texture A faint 1px grid on the hero, drawn with a gradient rather than an image so it costs no request and scales cleanly. Motion Colour transitions only, plus a short reveal. prefers-reduced- motion removes both. ========================================================================== */

:root { color-scheme: light dark;

/ ---------------------------------------------------------------- type / --font-sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; --font-mono: ui-monospace, "Cascadia Mono", "SF Mono", SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;

--text-2xs: 0.6875rem; --text-xs: 0.75rem; --text-sm: 0.8125rem; --text-base: 0.9375rem; --text-md: 1.0625rem; --text-lg: 1.25rem; --text-xl: 1.5rem; --text-2xl: 1.875rem; --text-3xl: 2.5rem; --text-4xl: 3.25rem;

--leading-tight: 1.15; --leading-snug: 1.35; --leading-normal: 1.6; --leading-code: 1.55;

--tracking-tight: -0.02em; --tracking-label: 0.09em;

/ -------------------------------------------------------------- space / --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem; --space-4: 1rem; --space-5: 1.25rem; --space-6: 1.75rem; --space-7: 2.5rem; --space-8: 3.5rem; --space-9: 5rem;

/ -------------------------------------------------------------- shape / --radius-sm: 2px; --radius-md: 4px; --radius-lg: 8px; --border-w: 1px; --rule-w: 2px;

/ ----------------------------------------------------------- measures / --measure: 68ch; --page-max: 76rem; --prose-max: 46rem;

/ ------------------------------------------------------------- colour / --bg: #fbfcfd; --bg-subtle: #f2f5f8; --bg-inset: #e9eef3; --bg-code: #f4f7fa;

--fg: #12161c; --fg-muted: #414b57; --fg-faint: #5d6875;

--border: #ccd5de; --border-strong: #9aa7b4;

--accent: #0a58c2; --accent-hover: #074698; --accent-fg: #ffffff; --accent-soft: rgba(10, 88, 194, 0.09); --accent-line: rgba(10, 88, 194, 0.32);

--focus: #b1450a; --signal: #1a6f42; --signal-soft: rgba(26, 111, 66, 0.1); --note-bg: rgba(10, 88, 194, 0.06);

--grid-line: rgba(18, 22, 28, 0.055); --shadow-card: 0 1px 2px rgba(18, 22, 28, 0.05); }

@media (prefers-color-scheme: dark) { :root { --bg: #0c0f13; --bg-subtle: #131820; --bg-inset: #090c10; --bg-code: #10151c;

--fg: #e6ecf3; --fg-muted: #b0bcc9; --fg-faint: #8e9baa;

--border: #2c3641; --border-strong: #4a5764;

--accent: #74b0ff; --accent-hover: #a2cdff; --accent-fg: #06121f; --accent-soft: rgba(116, 176, 255, 0.13); --accent-line: rgba(116, 176, 255, 0.34);

--focus: #ffb057; --signal: #5fd39b; --signal-soft: rgba(95, 211, 155, 0.13); --note-bg: rgba(116, 176, 255, 0.09);

--grid-line: rgba(230, 236, 243, 0.05); --shadow-card: none; } }

/ ========================================================================== Reset and base ========================================================================== /

, ::before, *::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; scroll-padding-top: var(--space-7); }

body { margin: 0; background: var(--bg); color: var(--fg); font-family: var(--font-sans); font-size: var(--text-base); line-height: var(--leading-normal); -webkit-font-smoothing: antialiased; font-variant-ligatures: none; }

h1, h2, h3, h4 { margin: 0 0 var(--space-3); font-weight: 660; line-height: var(--leading-tight); letter-spacing: var(--tracking-tight); text-wrap: balance; }

h1 { font-size: clamp(var(--text-xl), 1.1rem + 2.4vw, var(--text-3xl)); }

h2 { font-size: clamp(var(--text-lg), 1rem + 1vw, var(--text-2xl)); }

h3 { font-size: var(--text-lg); line-height: var(--leading-snug); }

h4 { font-size: var(--text-md); }

p, ul, ol, dl, figure, table { margin: 0 0 var(--space-4); }

p, li { max-width: var(--measure); }

li + li { margin-top: var(--space-2); }

ul, ol { padding-left: var(--space-5); }

a { color: var(--accent); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 0.18em; }

a:hover { color: var(--accent-hover); text-decoration-thickness: 2px; }

strong { font-weight: 650; }

hr { height: 0; margin: var(--space-7) 0; border: 0; border-top: var(--border-w) solid var(--border); }

small { font-size: var(--text-sm); }

abbr[title] { text-decoration: underline dotted; cursor: help; }

/ Focus is never removed, only restyled, and the ring is its own colour so it reads against the accent on every surface. / :focus-visible { outline: var(--rule-w) solid var(--focus); outline-offset: 2px; border-radius: var(--radius-sm); }

::selection { background: var(--accent-soft); color: var(--fg); }

.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }

/ ========================================================================== Code ========================================================================== /

code, kbd, samp, pre { font-family: var(--font-mono); }

code { font-size: 0.88em; background: var(--bg-inset); border: var(--border-w) solid var(--border); border-radius: var(--radius-sm); padding: 0.08em 0.34em; overflow-wrap: break-word; }

a code { color: inherit; }

pre { margin: 0; padding: var(--space-4); background: var(--bg-code); border: var(--border-w) solid var(--border); border-radius: var(--radius-md); font-size: var(--text-sm); line-height: var(--leading-code); overflow-x: auto; overscroll-behavior-x: contain; }

pre code { font-size: inherit; background: none; border: 0; padding: 0; border-radius: 0; }

/ A block with a label gets the label as a header strip, drawn with a gradient border so no extra element or image is needed. / .code { margin-block: var(--space-4); border: var(--border-w) solid var(--border); border-radius: var(--radius-md); background: var(--bg-code); overflow: hidden; }

.code > figcaption { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); border-bottom: var(--border-w) solid var(--border); background: var(--bg-subtle); font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--fg-muted); }

.code > figcaption::before { content: ""; width: 0.5rem; height: 0.5rem; flex: none; border-radius: 50%; background: var(--accent); }

.code > figcaption .tag { margin-left: auto; color: var(--fg-faint); letter-spacing: 0.04em; }

.code > pre { border: 0; border-radius: 0; background: none; }

.tag { font-family: var(--font-mono); font-size: var(--text-2xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--fg-faint); }

kbd { font-size: 0.82em; background: var(--bg-subtle); border: var(--border-w) solid var(--border-strong); border-bottom-width: var(--rule-w); border-radius: var(--radius-sm); padding: 0.05em 0.4em; }

/ ========================================================================== Layout ========================================================================== /

.wrap { max-width: var(--page-max); margin-inline: auto; padding-inline: var(--space-4); }

@media (min-width: 48rem) { .wrap { padding-inline: var(--space-6); } }

.skip-link { position: absolute; left: var(--space-3); top: 0; z-index: 20; margin: 0; padding: var(--space-2) var(--space-4); background: var(--bg); border: var(--rule-w) solid var(--focus); border-radius: var(--radius-md); font-size: var(--text-sm); font-weight: 600; text-decoration: none; / Fully clear of the viewport until focused: a percentage of its own height keeps it hidden at any text size, unlike a hand-picked offset. / transform: translateY(-150%); transition: transform 120ms ease; }

.skip-link:focus { transform: translateY(var(--space-3)); }

/ ========================================================================== Site header and navigation ========================================================================== /

.masthead { position: sticky; top: 0; z-index: 15; background: color-mix(in srgb, var(--bg) 88%, transparent); backdrop-filter: blur(10px); border-bottom: var(--border-w) solid var(--border); }

.masthead .wrap { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-2) var(--space-5); padding-block: var(--space-3); }

.brand { display: inline-flex; align-items: baseline; gap: var(--space-2); font-family: var(--font-mono); font-size: var(--text-md); font-weight: 700; letter-spacing: var(--tracking-tight); color: var(--fg); text-decoration: none; }

.brand .brand-mark { color: var(--accent); }

.brand .brand-sub { font-weight: 400; font-size: var(--text-sm); color: var(--fg-faint); }

.nav { display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-4); margin: 0; padding: 0; list-style: none; font-size: var(--text-sm); }

.nav li { margin: 0; }

.nav a { display: inline-block; padding: var(--space-1) 0; color: var(--fg-muted); text-decoration: none; }

.nav a:hover { color: var(--fg); text-decoration: underline; text-underline-offset: 0.25em; }

.nav a[aria-current="page"] { color: var(--fg); font-weight: 620; }

.nav a[aria-current="page"]::after { content: ""; display: block; height: var(--rule-w); margin-top: 2px; background: var(--accent); }

@media (max-width: 34rem) { .brand .brand-sub { display: none; } }

/ ========================================================================== Hero ========================================================================== /

.hero { position: relative; isolation: isolate; border-bottom: var(--border-w) solid var(--border); padding-block: var(--space-7) var(--space-6); overflow: hidden; }

/ Faint drafting grid, drawn rather than fetched. / .hero::before { content: ""; position: absolute; inset: 0; z-index: -1; background-image: linear-gradient(var(--grid-line) 1px, transparent 1px), linear-gradient(90deg, var(--grid-line) 1px, transparent 1px); background-size: var(--space-6) var(--space-6); mask-image: linear-gradient(to bottom, #000, transparent 78%); }

.hero .wrap { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-6); }

@media (min-width: 62rem) { .hero .wrap { grid-template-columns: minmax(0, 1.35fr) minmax(20rem, 0.85fr); align-items: start; } }

.kicker { display: inline-flex; align-items: center; gap: var(--space-2); margin: 0 0 var(--space-3); font-family: var(--font-mono); font-size: var(--text-2xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--fg-faint); }

.kicker::before { content: ""; width: 1.25rem; height: var(--rule-w); background: var(--accent); }

.hero h1 { max-width: 22ch; margin-bottom: var(--space-4); }

.lede { max-width: 60ch; font-size: var(--text-md); line-height: var(--leading-snug); color: var(--fg-muted); }

.lede strong { color: var(--fg); }

.plain-sentence { max-width: 60ch; margin-top: var(--space-5); padding: var(--space-3) var(--space-4); border-left: var(--rule-w) solid var(--accent); background: var(--note-bg); font-size: var(--text-base); color: var(--fg); }

.plain-sentence .label { display: block; margin-bottom: var(--space-1); font-family: var(--font-mono); font-size: var(--text-2xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--accent); }

/ The instrument panel beside the pitch: the verified numbers, at rest. / .readout { border: var(--border-w) solid var(--border); border-radius: var(--radius-lg); background: var(--bg-subtle); box-shadow: var(--shadow-card); overflow: hidden; }

.readout-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); padding: var(--space-2) var(--space-4); border-bottom: var(--border-w) solid var(--border); font-family: var(--font-mono); font-size: var(--text-2xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--fg-faint); }

.readout-head .dot { width: 0.5rem; height: 0.5rem; border-radius: 50%; background: var(--signal); }

.readout dl { margin: 0; padding: var(--space-2) var(--space-4) var(--space-4); }

.readout .row { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-4); padding-block: var(--space-2); border-bottom: var(--border-w) solid var(--border); }

.readout .row:last-child { border-bottom: 0; }

.readout dt { font-size: var(--text-sm); color: var(--fg-muted); }

.readout dd { margin: 0; font-family: var(--font-mono); font-size: var(--text-base); font-weight: 700; color: var(--fg); text-align: right; white-space: nowrap; }

.readout dd .unit { font-weight: 400; color: var(--fg-faint); }

.hero-foot { margin: var(--space-3) 0 0; font-family: var(--font-mono); font-size: var(--text-xs); line-height: var(--leading-snug); color: var(--fg-faint); }

/ ========================================================================== Buttons ========================================================================== /

.actions { display: flex; flex-wrap: wrap; gap: var(--space-3); margin-block: var(--space-5) 0; padding: 0; list-style: none; }

.actions li { margin: 0; }

.btn { display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); min-height: 2.5rem; border: var(--border-w) solid var(--border-strong); border-radius: var(--radius-md); background: var(--bg); color: var(--fg); font: inherit; font-size: var(--text-sm); font-weight: 620; text-decoration: none; transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease; }

.btn:hover { border-color: var(--fg-faint); background: var(--bg-subtle); color: var(--fg); }

.btn-primary { background: var(--accent); border-color: var(--accent); color: var(--accent-fg); }

.btn-primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); color: var(--accent-fg); }

.btn .arrow { font-family: var(--font-mono); opacity: 0.7; }

/ ========================================================================== Page sections ========================================================================== /

main { display: block; }

.section { padding-block: var(--space-6); border-bottom: var(--border-w) solid var(--border); }

.section:last-of-type { border-bottom: 0; }

.section-head { margin-bottom: var(--space-5); }

.section-head p { max-width: var(--measure); color: var(--fg-muted); }

.eyebrow { display: block; margin-bottom: var(--space-2); font-family: var(--font-mono); font-size: var(--text-2xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--accent); }

.page-head { padding-block: var(--space-6) var(--space-5); border-bottom: var(--rule-w) solid var(--accent); }

.page-head h1 { max-width: 26ch; }

.page-head .lede { margin-bottom: 0; }

/ ========================================================================== Cards and grids ========================================================================== /

.grid { display: grid; gap: var(--space-4); grid-template-columns: minmax(0, 1fr); margin: 0 0 var(--space-4); padding: 0; list-style: none; }

@media (min-width: 42rem) { .grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

@media (min-width: 42rem) { .grid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

@media (min-width: 64rem) { .grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

.card { margin: 0; padding: var(--space-4); border: var(--border-w) solid var(--border); border-radius: var(--radius-md); background: var(--bg-subtle); box-shadow: var(--shadow-card); }

.card > :last-child { margin-bottom: 0; }

.card h3 { margin-top: 0; font-size: var(--text-md); }

.card p, .card ul, .card ol { font-size: var(--text-sm); color: var(--fg-muted); }

.card .code { background: var(--bg); }

/ A card whose title carries a two digit number, as in the guides index. / .num { display: block; margin-bottom: var(--space-2); font-family: var(--font-mono); font-size: var(--text-xs); font-weight: 700; letter-spacing: var(--tracking-label); color: var(--accent); }

/ ========================================================================== Metric tiles ========================================================================== /

.metrics { display: grid; gap: var(--border-w); grid-template-columns: minmax(0, 1fr); margin: 0 0 var(--space-5); padding: 0; list-style: none; border: var(--border-w) solid var(--border); border-radius: var(--radius-md); background: var(--border); overflow: hidden; }

@media (min-width: 38rem) { .metrics-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

@media (min-width: 58rem) { .metrics-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

.metrics li { margin: 0; padding: var(--space-4); background: var(--bg); }

.metric-value { display: block; font-family: var(--font-mono); font-size: var(--text-xl); font-weight: 700; letter-spacing: var(--tracking-tight); line-height: 1.1; color: var(--fg); }

.metric-value .unit { font-size: var(--text-sm); font-weight: 400; color: var(--fg-faint); letter-spacing: 0; }

.metric-label { display: block; margin-top: var(--space-1); font-size: var(--text-sm); color: var(--fg-muted); }

/ ========================================================================== Guides: sticky index beside the prose ========================================================================== /

.guide-layout { display: grid; gap: var(--space-6); grid-template-columns: minmax(0, 1fr); align-items: start; }

@media (min-width: 64rem) { .guide-layout { grid-template-columns: 15rem minmax(0, 1fr); gap: var(--space-7); } }

.toc { border: var(--border-w) solid var(--border); border-radius: var(--radius-md); background: var(--bg-subtle); padding: var(--space-3) var(--space-4) var(--space-4); }

@media (min-width: 64rem) { .toc { position: sticky; top: calc(var(--space-9) + var(--space-2)); max-height: calc(100vh - var(--space-9) - var(--space-5)); overflow-y: auto; } }

.toc h2 { margin: 0 0 var(--space-2); padding: 0; border: 0; font-family: var(--font-mono); font-size: var(--text-2xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--fg-faint); }

.toc ol { margin: 0; padding: 0; list-style: none; counter-reset: guide; }

.toc li { margin: 0; }

.toc li + li { margin-top: 1px; }

.toc a { display: grid; grid-template-columns: 1.6rem minmax(0, 1fr); gap: var(--space-2); padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); font-size: var(--text-sm); line-height: var(--leading-snug); color: var(--fg-muted); text-decoration: none; }

.toc a::before { counter-increment: guide; content: counter(guide, decimal-leading-zero); font-family: var(--font-mono); font-size: var(--text-xs); color: var(--fg-faint); }

.toc a:hover { background: var(--bg); color: var(--fg); }

/ ========================================================================== Guide sections ========================================================================== /

.guide { padding-block: var(--space-6); border-bottom: var(--border-w) solid var(--border); }

.guide:first-child { padding-top: 0; }

.guide:last-child { border-bottom: 0; padding-bottom: 0; }

.guide > h2 { display: flex; align-items: baseline; gap: var(--space-3); margin-top: 0; padding-top: 0; border-top: 0; }

.guide > h2 .index { flex: none; font-family: var(--font-mono); font-size: var(--text-sm); font-weight: 700; letter-spacing: var(--tracking-label); color: var(--accent); }

.guide > h2 .index::after { content: " /"; color: var(--fg-faint); }

.guide .answer { font-size: var(--text-md); color: var(--fg-muted); }

.subhead { margin-top: var(--space-5); padding-top: var(--space-1); font-size: var(--text-md); font-weight: 660; letter-spacing: var(--tracking-tight); color: var(--fg); }

.subhead::before { content: ""; display: inline-block; width: 0.5rem; height: var(--rule-w); margin-right: var(--space-2); vertical-align: 0.2em; background: var(--accent); }

/ The call list an MCP client receives, rendered as an ordered list of tools rather than prose. / .call-list { margin: 0 0 var(--space-4); padding: 0; list-style: none; border-top: var(--border-w) solid var(--border); }

.call-list > li { margin: 0; padding: var(--space-3) 0; border-bottom: var(--border-w) solid var(--border); }

.call-list > li:last-child { border-bottom: 0; }

.call { display: inline-block; font-family: var(--font-mono); font-size: var(--text-sm); font-weight: 700; color: var(--fg); background: var(--bg-inset); border: var(--border-w) solid var(--border); border-radius: var(--radius-sm); padding: 0.05em 0.4em; }

.call-list p { margin: var(--space-2) 0 0; font-size: var(--text-sm); color: var(--fg-muted); }

/ Definition rows for arguments: name, type, then the note. / .args { margin: 0 0 var(--space-4); border-top: var(--border-w) solid var(--border); }

.args > div { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-1) var(--space-4); padding-block: var(--space-2); border-bottom: var(--border-w) solid var(--border); }

@media (min-width: 48rem) { .args > div { grid-template-columns: minmax(9rem, 0.4fr) minmax(0, 1fr); } }

.args dt { font-family: var(--font-mono); font-size: var(--text-sm); font-weight: 700; color: var(--fg); overflow-wrap: break-word; }

.args dd { margin: 0; font-size: var(--text-sm); color: var(--fg-muted); }

.args .type { font-family: var(--font-mono); font-size: var(--text-xs); font-weight: 400; color: var(--fg-faint); }

/ ========================================================================== Notes and callouts ========================================================================== /

.note { margin-block: var(--space-4); padding: var(--space-3) var(--space-4); border: var(--border-w) solid var(--border); border-left: var(--rule-w) solid var(--accent); border-radius: var(--radius-md); background: var(--note-bg); font-size: var(--text-sm); }

.note > :last-child { margin-bottom: 0; }

.note .note-label { display: block; margin-bottom: var(--space-1); font-family: var(--font-mono); font-size: var(--text-2xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--accent); }

.note-signal { border-left-color: var(--signal); background: var(--signal-soft); }

.note-signal .note-label { color: var(--signal); }

/ Numbered rules the plane enforces, shown as a fenced list. / .rules { margin: 0 0 var(--space-4); padding: 0; list-style: none; counter-reset: rule; }

.rules > li { margin: 0; padding: var(--space-3) 0 var(--space-3) var(--space-6); position: relative; counter-increment: rule; border-top: var(--border-w) solid var(--border); font-size: var(--text-sm); }

.rules > li:last-child { border-bottom: var(--border-w) solid var(--border); }

.rules > li::before { content: counter(rule); position: absolute; left: 0; top: var(--space-3); width: 1.5rem; height: 1.5rem; display: grid; place-items: center; border-radius: 50%; background: var(--bg-inset); border: var(--border-w) solid var(--border); font-family: var(--font-mono); font-size: var(--text-xs); font-weight: 700; color: var(--fg-muted); }

/ ========================================================================== Tables ========================================================================== /

.table-scroll { margin-block: var(--space-4); overflow-x: auto; overscroll-behavior-x: contain; border: var(--border-w) solid var(--border); border-radius: var(--radius-md); }

table.spec { width: 100%; min-width: 30rem; border-collapse: collapse; font-size: var(--text-sm); }

table.spec caption { caption-side: top; text-align: left; padding: var(--space-3) var(--space-4); border-bottom: var(--border-w) solid var(--border); background: var(--bg-subtle); font-family: var(--font-mono); font-size: var(--text-xs); color: var(--fg-muted); }

table.spec th, table.spec td { padding: var(--space-3) var(--space-4); text-align: left; vertical-align: top; border-bottom: var(--border-w) solid var(--border); }

table.spec thead th { background: var(--bg-subtle); font-family: var(--font-mono); font-size: var(--text-xs); font-weight: 700; letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--fg-muted); white-space: nowrap; }

table.spec tbody th { font-weight: 620; color: var(--fg); }

table.spec tbody th code { background: none; border: 0; padding: 0; font-size: 1em; font-weight: inherit; }

table.spec td { color: var(--fg-muted); }

table.spec tbody tr:last-child th, table.spec tbody tr:last-child td { border-bottom: 0; }

table.spec tbody tr:hover th, table.spec tbody tr:hover td { background: var(--accent-soft); }

table.spec .num-cell { font-family: var(--font-mono); font-weight: 700; color: var(--fg); white-space: nowrap; }

/ The figure column carries the weight, so it is the one held in ink. / table.spec .figure { font-family: var(--font-mono); font-weight: 700; color: var(--fg); white-space: nowrap; }

/ ========================================================================== Use cases ========================================================================== /

.case { padding-block: var(--space-6); border-bottom: var(--border-w) solid var(--border); }

.case:last-of-type { border-bottom: 0; padding-bottom: 0; }

.case > h2 { display: flex; align-items: baseline; gap: var(--space-3); margin-top: 0; padding-top: 0; border-top: 0; }

.case .case-index { flex: none; font-family: var(--font-mono); font-size: var(--text-sm); font-weight: 700; letter-spacing: var(--tracking-label); color: var(--accent); }

.case .case-index::after { content: " /"; color: var(--fg-faint); }

.case-lede { max-width: var(--measure); font-size: var(--text-md); color: var(--fg-muted); }

.facts { display: grid; gap: var(--space-3); grid-template-columns: minmax(0, 1fr); margin: 0 0 var(--space-4); }

@media (min-width: 58rem) { .facts { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--border-w); border: var(--border-w) solid var(--border); border-radius: var(--radius-md); background: var(--border); overflow: hidden; } }

.facts > div { margin: 0; padding: var(--space-4); background: var(--bg-subtle); }

.facts dt { margin-bottom: var(--space-1); font-family: var(--font-mono); font-size: var(--text-2xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--accent); }

.facts dd { margin: 0; font-size: var(--text-sm); color: var(--fg-muted); }

.facts dd p:last-child { margin-bottom: 0; }

/ ========================================================================== Footer ========================================================================== /

.site-footer { border-top: var(--rule-w) solid var(--accent); background: var(--bg-subtle); }

.site-footer .wrap { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-5); padding-block: var(--space-6); }

@media (min-width: 52rem) { .site-footer .wrap { grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); } }

.site-footer h2 { margin: 0 0 var(--space-2); font-family: var(--font-mono); font-size: var(--text-2xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--fg-faint); }

.site-footer p { max-width: 52ch; font-size: var(--text-sm); color: var(--fg-muted); }

.footer-links { margin: 0; padding: 0; list-style: none; display: grid; gap: var(--space-1) var(--space-4); grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); font-size: var(--text-sm); }

.footer-links li { margin: 0; }

.site-footer .colophon { grid-column: 1 / -1; padding-top: var(--space-4); border-top: var(--border-w) solid var(--border); font-family: var(--font-mono); font-size: var(--text-xs); color: var(--fg-faint); }

/ ========================================================================== Progressive reveal, motion and print ========================================================================== /

.reveal { animation: rise 320ms cubic-bezier(0.2, 0.7, 0.3, 1) both; }

@keyframes rise { from { opacity: 0; transform: translateY(6px); }

to { opacity: 1; transform: none; } }

@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; }

, ::before, *::after { animation-duration: 1ms !important; animation-iteration-count: 1 !important; transition-duration: 1ms !important; }

.skip-link { transition: none; } }

@media print { :root { --bg: #ffffff; --bg-subtle: #ffffff; --bg-inset: #f4f4f4; --bg-code: #f7f7f7; --fg: #000000; --fg-muted: #333333; --fg-faint: #444444; --accent: #000000; --focus: #000000; --signal: #000000; --accent-soft: transparent; --note-bg: #ffffff; --signal-soft: #ffffff; --shadow-card: none; }

.masthead, .actions, .toc, .skip-link { display: none; }

.guide-layout { grid-template-columns: minmax(0, 1fr); }

.code, .card, .call-list, pre { break-inside: avoid; } } / ============================================================ screenshots Real product screenshots. Same tokens as everything else: 1px rule, tight radius, mono uppercase caption. aspect-ratio reserves the box so nothing shifts while an image decodes, and loading=lazy keeps the first paint light. ====================================================================== /

.shot { margin: var(--space-6) 0; }

.shot > img { display: block; width: 100%; height: auto; border: var(--border-w) solid var(--border); border-radius: var(--radius-md); background: var(--bg-inset); box-shadow: var(--shadow-card); }

.shot > figcaption { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); margin-top: var(--space-3); font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--fg-faint); }

.shot > figcaption::before { content: ""; width: 0.5rem; height: 0.5rem; flex: none; border-radius: 50%; background: var(--signal); }

.shot > figcaption .tag { color: var(--fg-muted); letter-spacing: 0.04em; }

.shot-wide > img { aspect-ratio: 1900 / 803; object-fit: cover; object-position: center; }

/ Brand mark in the masthead, sized to sit on the text baseline. / .brand-mark img, .brand-mark svg { display: inline-block; width: 1.15em; height: 1.15em; vertical-align: -0.2em; margin-right: 0.4em; }

/* ============================================================ statistics charts Three inline SVG figures. Every paint resolves to a token above, with the light value written as the literal fallback so the markup also renders on its own. Nothing here introduces a new colour, space or size.

The charts are laid out at a fixed 880 unit width so the axis type never rescales into illegibility. Below the width where 13 unit type would fall under about 11 pixels on screen, the figure scrolls sideways instead of shrinking the labels. ====================================================================== */

.chart-scroll { margin: 0; overflow-x: auto; overscroll-behavior-x: contain; border: var(--border-w) solid var(--border); border-radius: var(--radius-md); background: var(--bg-subtle); box-shadow: var(--shadow-card); }

.chart { display: block; width: 100%; height: auto; min-width: 40rem; }

.chart-figure { margin: var(--space-4) 0; }

.chart-note { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-2) var(--space-3); max-width: none; padding: var(--space-2) var(--space-4); border: var(--border-w) solid var(--border); border-top: 0; border-radius: 0 0 var(--radius-md) var(--radius-md); background: var(--bg-subtle); font-family: var(--font-mono); font-size: var(--text-xs); line-height: var(--leading-snug); color: var(--fg-faint); }

.chart-note .tag { margin-left: auto; color: var(--fg-muted); }

/ A tile whose value is a licence expression rather than a number. / .metric-value.is-phrase { font-size: var(--text-md); line-height: var(--leading-snug); }

.source-list { margin: 0; padding: 0; list-style: none; border-top: var(--border-w) solid var(--border); }

.source-list > li { margin: 0; padding-block: var(--space-3); border-bottom: var(--border-w) solid var(--border); }

.source-list dl { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-1) var(--space-4); margin: 0; }

@media (min-width: 56rem) { .source-list dl { grid-template-columns: 12rem minmax(0, 1fr); }

.source-list dt { margin: 0; font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--fg-faint); } }

.source-list dd { margin: 0; font-size: var(--text-sm); color: var(--fg-muted); overflow-wrap: anywhere; }

</style> </head> <body> <a class="skip-link" href="#main">Skip to content</a>

<header class="masthead"> <div class="wrap"> <a class="brand" href="/"><span class="brand-mark">DeskVNC</span> <span class="brand-sub">agent hub</span></a> <nav aria-label="Main"> <ul class="nav"> <li><a href="/">Overview</a></li> <li><a href="/guides">Guides</a></li> <li><a href="/usecases">Use cases</a></li> <li><a href="/benchmarks">Benchmarks</a></li> <li><a href="by-the-numbers.html" aria-current="page">Numbers</a></li> </ul> </nav> </div> </header>

<div class="wrap"> <div class="page-head"> <span class="eyebrow">Numbers</span> <h1>The project, measured from the GitHub API</h1> <p class="lede">Every figure on this page came out of a GitHub API call against <strong>psmux/DeskVNC</strong>, pulled live and written down below with the exact command that produced it. Nothing here is rounded up, extrapolated or estimated, and the three charts plot only what the API actually returns.</p> </div> </div>

<main id="main" class="wrap">

<section class="section"> <ul class="metrics metrics-4"> <li> <span class="metric-value">70</span> <span class="metric-label">Stars on the repository</span> </li> <li> <span class="metric-value">8</span> <span class="metric-label">Forks, from people running their own copy</span> </li> <li> <span class="metric-value">26</span> <span class="metric-label">Tagged releases, every one with Windows, macOS and Linux artifacts</span> </li> <li> <span class="metric-value">2</span> <span class="metric-label">Contributor accounts, covering all 225 commits on <code>main</code></span> </li> <li> <span class="metric-value">1,040</span> <span class="metric-label">Downloads of release assets: installers, images, packages and checksum files</span> </li> <li> <span class="metric-value">225</span> <span class="metric-label">Commits on <code>main</code>, read from the commits pagination header</span> </li> <li> <span class="metric-value is-phrase">MIT OR Apache-2.0</span> <span class="metric-label">Dual licensed, with <code>LICENSE-MIT</code> and <code>LICENSE-APACHE</code> at the root</span> </li> <li> <span class="metric-value">70 <span class="unit">days</span></span> <span class="metric-label">From repository creation on 30 July 2026 to the 26th release on 8 October 2026</span> </li> </ul> <div class="note"> <span class="note-label">How to read the downloads figure</span> <p>The 1,040 is the sum of <code>download_count</code> across all 209 assets on the 26 releases, which are the installers, disk images, packages, tarballs and SHA256 checksum files the project attaches. It counts uploaded release assets, so each count is a completed download of a real file rather than a page view, and the counter is maintained by GitHub rather than by the project.</p> </div> </section>

<section class="section" id="releases-over-time"> <div class="section-head"> <span class="eyebrow">Chart one</span> <h2>Cumulative releases over time</h2> <p>The GitHub API does not publish a historical star count, so this chart plots the release series instead, which is a complete record. Each step is one tagged release at its <code>published_at</code> timestamp, read from the releases endpoint.</p> </div> <figure class="chart-figure"> <div class="chart-scroll"> <svg class="chart" viewBox="0 0 880 306" role="img" aria-labelledby="chart-a-title chart-a-desc"> <title id="chart-a-title">Cumulative releases over time, from the first release on 30 July 2026 to the 26th on 8 October 2026</title> <desc id="chart-a-desc">A step line climbing from zero to 26. Fifteen releases are published by 23 August 2026. The line is flat until 14 September, then steps up 11 times in 25 days, with 6 of those 11 inside the final 6 days. One mark sits on the line for every release.</desc> <rect x="58" y="22" width="794" height="226" fill="var(--bg-subtle, #f2f5f8)" stroke="var(--border, #ccd5de)" stroke-width="1"/> <line x1="58" y1="248.0" x2="852" y2="248.0" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="48.0" y="252.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">0</text> <line x1="58" y1="207.6" x2="852" y2="207.6" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="48.0" y="211.6" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">5</text> <line x1="58" y1="167.3" x2="852" y2="167.3" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="48.0" y="171.3" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">10</text> <line x1="58" y1="126.9" x2="852" y2="126.9" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="48.0" y="130.9" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">15</text> <line x1="58" y1="86.6" x2="852" y2="86.6" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="48.0" y="90.6" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">20</text> <line x1="58" y1="46.2" x2="852" y2="46.2" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="48.0" y="50.2" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">25</text> <line x1="80.4" y1="22" x2="80.4" y2="248" stroke="var(--grid-line, rgba(18,22,28,0.06))" stroke-width="1"/> <text x="80.4" y="269.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="middle">1 Aug</text> <line x1="427.0" y1="22" x2="427.0" y2="248" stroke="var(--grid-line, rgba(18,22,28,0.06))" stroke-width="1"/> <text x="427.0" y="269.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="middle">1 Sep</text> <line x1="762.5" y1="22" x2="762.5" y2="248" stroke="var(--grid-line, rgba(18,22,28,0.06))" stroke-width="1"/> <text x="762.5" y="269.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="middle">1 Oct</text> <path d="M 66.7 248.0 L 66.7 248.0 L 66.7 239.9 L 87.5 239.9 L 87.5 231.9 L 87.5 231.9 L 87.5 223.8 L 87.5 223.8 L 87.5 215.7 L 99.4 215.7 L 99.4 207.6 L 100.4 207.6 L 100.4 199.6 L 100.9 199.6 L 100.9 191.5 L 124.0 191.5 L 124.0 183.4 L 148.7 183.4 L 148.7 175.4 L 150.8 175.4 L 150.8 167.3 L 152.5 167.3 L 152.5 159.2 L 153.9 159.2 L 153.9 151.1 L 263.7 151.1 L 263.7 143.1 L 263.9 143.1 L 263.9 135.0 L 332.3 135.0 L 332.3 126.9 L 578.0 126.9 L 578.0 118.9 L 579.7 118.9 L 579.7 110.8 L 655.9 110.8 L 655.9 102.7 L 681.8 102.7 L 681.8 94.6 L 705.7 94.6 L 705.7 86.6 L 793.7 86.6 L 793.7 78.5 L 798.3 78.5 L 798.3 70.4 L 801.6 70.4 L 801.6 62.4 L 810.1 62.4 L 810.1 54.3 L 837.8 54.3 L 837.8 46.2 L 848.7 46.2 L 848.7 38.1 L 848.7 248.0 L 66.7 248.0 Z" fill="var(--accent-soft, rgba(10,88,194,0.09))" stroke="none"/> <path d="M 66.7 248.0 L 66.7 248.0 L 66.7 239.9 L 87.5 239.9 L 87.5 231.9 L 87.5 231.9 L 87.5 223.8 L 87.5 223.8 L 87.5 215.7 L 99.4 215.7 L 99.4 207.6 L 100.4 207.6 L 100.4 199.6 L 100.9 199.6 L 100.9 191.5 L 124.0 191.5 L 124.0 183.4 L 148.7 183.4 L 148.7 175.4 L 150.8 175.4 L 150.8 167.3 L 152.5 167.3 L 152.5 159.2 L 153.9 159.2 L 153.9 151.1 L 263.7 151.1 L 263.7 143.1 L 263.9 143.1 L 263.9 135.0 L 332.3 135.0 L 332.3 126.9 L 578.0 126.9 L 578.0 118.9 L 579.7 118.9 L 579.7 110.8 L 655.9 110.8 L 655.9 102.7 L 681.8 102.7 L 681.8 94.6 L 705.7 94.6 L 705.7 86.6 L 793.7 86.6 L 793.7 78.5 L 798.3 78.5 L 798.3 70.4 L 801.6 70.4 L 801.6 62.4 L 810.1 62.4 L 810.1 54.3 L 837.8 54.3 L 837.8 46.2 L 848.7 46.2 L 848.7 38.1" fill="none" stroke="var(--accent, #0a58c2)" stroke-width="2" stroke-linejoin="round" stroke-linecap="round"/> <circle cx="66.7" cy="239.9" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="87.5" cy="231.9" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="87.5" cy="223.8" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="87.5" cy="215.7" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="99.4" cy="207.6" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="100.4" cy="199.6" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="100.9" cy="191.5" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="124.0" cy="183.4" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="148.7" cy="175.4" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="150.8" cy="167.3" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="152.5" cy="159.2" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="153.9" cy="151.1" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="263.7" cy="143.1" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="263.9" cy="135.0" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="332.3" cy="126.9" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="578.0" cy="118.9" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="579.7" cy="110.8" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="655.9" cy="102.7" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="681.8" cy="94.6" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="705.7" cy="86.6" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="793.7" cy="78.5" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="798.3" cy="70.4" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="801.6" cy="62.4" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="810.1" cy="54.3" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="837.8" cy="46.2" r="2.5" fill="var(--accent, #0a58c2)"/> <circle cx="848.7" cy="38.1" r="2.5" fill="var(--accent, #0a58c2)"/> <line x1="66.7" y1="232.9" x2="66.7" y2="30" stroke="var(--accent, #0a58c2)" stroke-width="1" stroke-dasharray="2 3"/> <text x="73.7" y="35.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)" font-weight="700">v0.1.0, 30 Jul 2026</text> <text x="839.7" y="42.6" font-family="system-ui, -apple-system, Segoe UI, Roboto, sans-serif" font-size="13" fill="var(--fg, #12161c)" text-anchor="end" font-weight="700">26 releases</text> <text x="58.0" y="290.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)">Published date in 2026, one mark on the line for every release</text> <text x="58.0" y="14.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)">Cumulative releases</text> </svg> </div> <figcaption class="chart-note"><span>26 releases, 30 July 2026 to 8 October 2026</span> <span class="tag">source: gh api repos/psmux/DeskVNC/releases</span></figcaption> </figure> <p>Read this as shipping pace. The line is flat on the days nothing shipped and steps up on the days something did, and all 26 attach the same seven core artifacts: a Windows setup exe and MSI, a signed and notarized macOS disk image and app tarball, and <code>deb</code>, <code>rpm</code> and AppImage for Linux.</p> <p>Twenty six releases have gone out in 70 days. The steepest stretch is the last three weeks: 11 of the 26 land between 14 September and 8 October, and 6 of them land in the final 6 days, which is the agent plane, the code signing and the unattended support work listed in the release notes below. The project ships in bursts, so several builds go out inside one week rather than one every week.</p> </section>

<section class="section" id="commit-cadence"> <div class="section-head"> <span class="eyebrow">Chart two</span> <h2>Commit cadence per day</h2> <p>This chart plots commits per calendar day on <code>main</code>, grouped from the author date on each of the 100 most recent commits. Because the 100 oldest and newest commits in that page span exactly 25 August to 8 October 2026, the daily histogram across that window is complete: any commit inside the window is by definition among the 100.</p> </div> <figure class="chart-figure"> <div class="chart-scroll"> <svg class="chart" viewBox="0 0 880 272" role="img" aria-labelledby="chart-b-title chart-b-desc"> <title id="chart-b-title">Commits per calendar day on main, over the 45 day span of the 100 most recent commits, 25 August to 8 October 2026</title> <desc id="chart-b-desc">A bar chart over 45 consecutive days. The 100 commits land on 19 of those days, and the remaining 26 days are zero. The busiest day is 4 October 2026 with 21 commits, marked in green. The next busiest is 3 October 2026 with 15, then 25 September 2026 with 9. 4 October alone carries a fifth of the 100.</desc> <rect x="58" y="24" width="794" height="192" fill="var(--bg-subtle, #f2f5f8)" stroke="var(--border, #ccd5de)" stroke-width="1"/> <line x1="58" y1="216.0" x2="852" y2="216.0" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="48.0" y="220.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">0</text> <line x1="58" y1="172.4" x2="852" y2="172.4" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="48.0" y="176.4" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">5</text> <line x1="58" y1="128.7" x2="852" y2="128.7" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="48.0" y="132.7" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">10</text> <line x1="58" y1="85.1" x2="852" y2="85.1" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="48.0" y="89.1" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">15</text> <line x1="58" y1="41.5" x2="852" y2="41.5" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="48.0" y="45.5" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">20</text> <rect x="60.5" y="198.5" width="12.6" height="17.5" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="78.1" y="146.2" width="12.6" height="69.8" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="166.4" y="189.8" width="12.6" height="26.2" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="184.0" y="207.3" width="12.6" height="8.7" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="272.2" y="207.3" width="12.6" height="8.7" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="289.9" y="181.1" width="12.6" height="34.9" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="307.5" y="189.8" width="12.6" height="26.2" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="360.5" y="207.3" width="12.6" height="8.7" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="413.4" y="172.4" width="12.6" height="43.6" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="501.6" y="181.1" width="12.6" height="34.9" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="519.3" y="207.3" width="12.6" height="8.7" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="536.9" y="146.2" width="12.6" height="69.8" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="572.2" y="207.3" width="12.6" height="8.7" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="607.5" y="137.5" width="12.6" height="78.5" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="748.6" y="85.1" width="12.6" height="130.9" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="766.3" y="32.7" width="12.6" height="183.3" rx="1.5" fill="var(--signal, #1a6f42)"/> <rect x="783.9" y="181.1" width="12.6" height="34.9" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="819.2" y="172.4" width="12.6" height="43.6" rx="1.5" fill="var(--accent, #0a58c2)"/> <rect x="836.9" y="181.1" width="12.6" height="34.9" rx="1.5" fill="var(--accent, #0a58c2)"/> <text x="62.8" y="237.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)">25 Aug</text> <text x="190.3" y="237.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="middle">1 Sep</text> <text x="719.7" y="237.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="middle">1 Oct</text> <text x="847.2" y="237.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">8 Oct</text> <text x="772.6" y="22.7" font-family="system-ui, -apple-system, Segoe UI, Roboto, sans-serif" font-size="13" fill="var(--fg, #12161c)" text-anchor="middle" font-weight="700">21</text> <line x1="772.6" y1="27.7" x2="772.6" y2="31" stroke="var(--signal, #1a6f42)" stroke-width="1" stroke-dasharray="2 3"/> <text x="58.0" y="15.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)">Commits per calendar day</text> <text x="58.0" y="258.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)">100 most recent commits, spread over 45 consecutive days, days with no commit left at zero</text> </svg> </div> <figcaption class="chart-note"><span>100 commits across 45 consecutive days, 19 of them carrying work</span> <span class="tag">source: gh api repos/psmux/DeskVNC/commits</span></figcaption> </figure> <p>Read this as consistency rather than a drip. The 100 commits land on 19 days and the remaining 26 days are genuinely zero, which is what a focused project looks like: work arrives as a finished change set rather than as a daily trickle of unrelated edits.</p> <p>The right end of the chart is the heaviest stretch in the repository so far. 3 and 4 October alone carry 36 of the 100 commits, and 4 October is the busiest single day at 21. The releases that follow those two days are v0.27.9 on 5 October, v0.27.10 on 7 October and v0.27.11 on 8 October, and the count on <code>main</code> today is 225.</p> </section>

<section class="section" id="languages"> <div class="section-head"> <span class="eyebrow">Chart three</span> <h2>Language breakdown by bytes</h2> <p>The languages endpoint returns byte counts per language for the whole repository. Bar length is proportional to bytes across a total of 10,022,989.</p> </div> <figure class="chart-figure"> <div class="chart-scroll"> <svg class="chart" viewBox="0 0 880 254" role="img" aria-labelledby="chart-c-title chart-c-desc"> <title id="chart-c-title">Repository languages by bytes, measured by the GitHub languages endpoint</title> <desc id="chart-c-desc">Six horizontal bars over a total of 10,022,989 bytes. Rust is 8,473,411 bytes, 84.54 percent. TypeScript is 1,396,424 bytes, 13.93 percent. Python is 85,710 bytes, 0.86 percent. Shell is 55,942 bytes, 0.56 percent. CSS is 11,120 bytes, 0.11 percent. HTML is 382 bytes, 0.004 percent. Rust and TypeScript together are 98.47 percent of the measured bytes.</desc> <rect x="108" y="6" width="560" height="18" rx="2" fill="var(--bg-inset, #e9eef3)"/> <rect x="108" y="6" width="560.00" height="18" rx="2" fill="var(--accent, #0a58c2)"/> <text x="8.0" y="19.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)">Rust</text> <text x="686.0" y="19.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)" font-weight="700">8,473,411</text> <text x="872.0" y="19.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">84.54%</text> <rect x="108" y="38" width="560" height="18" rx="2" fill="var(--bg-inset, #e9eef3)"/> <rect x="108" y="38" width="92.29" height="18" rx="2" fill="var(--accent, #0a58c2)"/> <text x="8.0" y="51.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)">TypeScript</text> <text x="686.0" y="51.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)" font-weight="700">1,396,424</text> <text x="872.0" y="51.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">13.93%</text> <rect x="108" y="70" width="560" height="18" rx="2" fill="var(--bg-inset, #e9eef3)"/> <rect x="108" y="70" width="5.66" height="18" rx="2" fill="var(--accent, #0a58c2)"/> <text x="8.0" y="83.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)">Python</text> <text x="686.0" y="83.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)" font-weight="700">85,710</text> <text x="872.0" y="83.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">0.86%</text> <rect x="108" y="102" width="560" height="18" rx="2" fill="var(--bg-inset, #e9eef3)"/> <rect x="108" y="102" width="3.70" height="18" rx="2" fill="var(--accent, #0a58c2)"/> <text x="8.0" y="115.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)">Shell</text> <text x="686.0" y="115.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)" font-weight="700">55,942</text> <text x="872.0" y="115.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">0.56%</text> <rect x="108" y="134" width="560" height="18" rx="2" fill="var(--bg-inset, #e9eef3)"/> <rect x="108" y="134" width="1.50" height="18" rx="2" fill="var(--accent, #0a58c2)"/> <text x="8.0" y="147.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)">CSS</text> <text x="686.0" y="147.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)" font-weight="700">11,120</text> <text x="872.0" y="147.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">0.11%</text> <rect x="108" y="166" width="560" height="18" rx="2" fill="var(--bg-inset, #e9eef3)"/> <rect x="108" y="166" width="1.50" height="18" rx="2" fill="var(--accent, #0a58c2)"/> <text x="8.0" y="179.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)">HTML</text> <text x="686.0" y="179.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)" font-weight="700">382</text> <text x="872.0" y="179.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">0.004%</text> <line x1="0" y1="200" x2="880" y2="200" stroke="var(--border, #ccd5de)" stroke-width="1"/> <text x="8.0" y="222.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" letter-spacing="0.09em">Total</text> <text x="686.0" y="222.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="12" fill="var(--fg, #12161c)" font-weight="700">10,022,989</text> <text x="872.0" y="222.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)" text-anchor="end">100.00%</text> <text x="8.0" y="248.0" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, DejaVu Sans Mono, monospace" font-size="11" fill="var(--fg-faint, #5d6875)">Bar length is proportional to bytes. CSS and HTML fall below one pixel at this scale, so their exact byte counts are printed.</text> </svg> </div> <figcaption class="chart-note"><span>Rust 84.54%, TypeScript 13.93%, everything else 1.53%</span> <span class="tag">source: gh api repos/psmux/DeskVNC/languages</span></figcaption> </figure> <p>Read this as where the engineering sits. Rust is 84.54% of the measured bytes and TypeScript is 13.93%, so 98.47% of the repository is the Rust core plus the Tauri frontend, and the picture decoder, the protocol cores and the agent transport are all in the first language. That split is what a native client looks like, and it is why the whole picture can be decoded in Rust and painted through WebView2 without a frame ever crossing a process boundary.</p> <p>Python, Shell, CSS and HTML together are 1.53%: the build, test and release automation, and the handful of styles and pages the desktop app ships. The protocol cores are written from scratch rather than wrapped in another library, so what you see as one dominant language is the whole protocol surface.</p> </section>

<section class="section" id="release-log"> <div class="section-head"> <span class="eyebrow">Release log</span> <h2>The ten most recent releases</h2> <p>Dates are the GitHub <code>published_at</code> timestamps from the releases endpoint, which is what the chart above plots. Asset counts and download counts are read from the same response.</p> </div> <div class="table-scroll"> <table class="spec"> <caption>Ten most recent DeskVNC releases, from the GitHub releases API on 9 October 2026</caption> <thead> <tr> <th scope="col">Tag</th> <th scope="col">Published</th> <th scope="col">Assets</th> <th scope="col">Downloads</th> <th scope="col">What landed</th> </tr> </thead> <tbody> <tr> <th scope="row"><code>v0.27.11</code></th> <td class="figure">8 October 2026</td> <td class="figure">13</td> <td class="figure">21</td> <td>Adds a Linux build of DeskVNC Support as an x86_64 tarball, and compiles and tests the Boundary crates on Linux, macOS and Windows in CI.</td> </tr> <tr> <th scope="row"><code>v0.27.10</code></th> <td class="figure">7 October 2026</td> <td class="figure">11</td> <td class="figure">63</td> <td>Windows downloads are code signed through Certum, covering the setup exe, the MSI, the app inside them, <code>dvv</code> and DeskVNC Support.</td> </tr> <tr> <th scope="row"><code>v0.27.9</code></th> <td class="figure">5 October 2026</td> <td class="figure">11</td> <td class="figure">81</td> <td>Adds unattended access, so the person being helped can let a helper in at any time and can see who is connected at a glance, and adds a Windows build of DeskVNC Support.</td> </tr> <tr> <th scope="row"><code>v0.27.8</code></th> <td class="figure">4 October 2026</td> <td class="figure">9</td> <td class="figure">21</td> <td>Finds agents installed through nvm, fnm, Volta, asdf, mise, Homebrew or npm, and hands the screenshot straight to the model in the conversation.</td> </tr> <tr> <th scope="row"><code>v0.27.7</code></th> <td class="figure">4 October 2026</td> <td class="figure">9</td> <td class="figure">1</td> <td>Agents work with nothing to set up: the agent plane is on by default and connects OpenCode, Pi, Claude Code and Codex on each launch.</td> </tr> <tr> <th scope="row"><code>v0.27.6</code></th> <td class="figure">3 October 2026</td> <td class="figure">9</td> <td class="figure">16</td> <td>AI agents drive Windows over a named pipe, and the Windows and Linux installers both carry <code>dvv</code>.</td> </tr> <tr> <th scope="row"><code>v0.27.5</code></th> <td class="figure">25 September 2026</td> <td class="figure">10</td> <td class="figure">295</td> <td>Both SSH views use the native clipboard for copy and paste, and macOS installers carry the universal <code>dvv</code> executable.</td> </tr> <tr> <th scope="row"><code>v0.27.4</code></th> <td class="figure">23 September 2026</td> <td class="figure">9</td> <td class="figure">49</td> <td>System shortcuts such as Alt+Tab and the Windows key reach the remote on Windows, and Black and White mode stops flickering at scaled sizes.</td> </tr> <tr> <th scope="row"><code>v0.27.3</code></th> <td class="figure">21 September 2026</td> <td class="figure">9</td> <td class="figure">88</td> <td>Brings the Boundary support transport and the macOS DeskVNC Support app into the same source checkout and release workflow, with short numeric codes for attended support.</td> </tr> <tr> <th scope="row"><code>v0.27.2</code></th> <td class="figure">14 September 2026</td> <td class="figure">7</td> <td class="figure">311</td> <td>Scrolling runs in the same direction on the remote as locally on every platform, and the fullscreen button advertises the shortcut that is actually bound.</td> </tr> </tbody> </table> </div> <p>All 26 releases are published, not pre-release, and every one carries a <code>SHA256SUMS</code> file. The macOS artifacts are signed and notarized, so a download opens normally, and since v0.27.10 the Windows setup exe and MSI are code signed as well.</p> </section>

<section class="section" id="sources"> <div class="section-head"> <span class="eyebrow">Provenance</span> <h2>The exact commands behind every number</h2> <p>So any figure here can be rechecked rather than taken on trust. Run them with <code>gh</code> authenticated and compare against the raw JSON kept beside this page.</p> </div> <ul class="source-list"> <li> <dl> <dt>Repository</dt> <dd><code>gh api repos/psmux/DeskVNC</code> Stars, forks, open issues, license, <code>created_at</code> and <code>pushed_at</code>.</dd> </dl> </li> <li> <dl> <dt>Releases</dt> <dd><code>gh api 'repos/psmux/DeskVNC/releases?per_page=100'</code> The release list. 26 entries, and each entry carries <code>published_at</code> and the download count of every attached asset.</dd> </dl> </li> <li> <dl> <dt>Contributors</dt> <dd><code>gh api 'repos/psmux/DeskVNC/contributors?per_page=100'</code> The contributor list, two accounts, with a commit count for each.</dd> </dl> </li> <li> <dl> <dt>Languages</dt> <dd><code>gh api repos/psmux/DeskVNC/languages</code> Byte counts per language, 10,022,989 bytes in total.</dd> </dl> </li> <li> <dl> <dt>Commits</dt> <dd><code>gh api 'repos/psmux/DeskVNC/commits?per_page=100'</code> The 100 most recent commits on <code>main</code>, with the author date of each.</dd> </dl> </li> <li> <dl> <dt>Commit count</dt> <dd><code>gh api -i 'repos/psmux/DeskVNC/commits?per_page=1'</code> The <code>Link</code> header, whose last page number is the commit total on the default branch.</dd> </dl> </li> </ul> <div class="note note-signal"> <span class="note-label">What is deliberately not on this page</span> <p>GitHub publishes a star total but no star history, so there is no star-over-time chart here and none is implied. There is no download estimate either: the 1,040 is the asset counter the API returns. Every chart on this page plots a series the API actually returned, and its caption says which endpoint that was.</p> </div> </section>

<section class="section"> <div class="section-head"> <span class="eyebrow">Read next</span> <h2>Put the numbers to work</h2> </div> <ul class="grid grid-2"> <li class="card"> <h3><a href="/benchmarks">Benchmarks: 19 ms from screen to action</a></h3> <p>The measured agent plane numbers, with the 1920x1080 Windows desktop and the LAN they were taken on.</p> </li> <li class="card"> <h3><a href="https://github.com/psmux/DeskVNC/releases/latest">Download the latest release</a></h3> <p>Windows setup exe and MSI, a signed and notarized macOS disk image, and <code>deb</code>, <code>rpm</code> and AppImage for Linux, with checksum files attached.</p> </li> </ul> </section>

</main>

<footer class="site-footer"> <div class="wrap"> <div> <h2>DeskVNC</h2> <p>One window for every machine you look after, whether it speaks VNC, RDP or SSH. Native, written in Rust on Tauri 2, running on Windows, macOS and Linux, dual licensed MIT OR Apache-2.0.</p> </div> <nav aria-label="Footer"> <h2>Links</h2> <ul class="footer-links"> <li><a href="/">Overview</a></li> <li><a href="/guides">Guides</a></li> <li><a href="/usecases">Use cases</a></li> <li><a href="/benchmarks">Benchmarks</a></li> <li><a href="by-the-numbers.html">Numbers</a></li> <li><a href="https://github.com/psmux/DeskVNC/releases/latest">Downloads</a></li> <li><a href="https://github.com/psmux/DeskVNC">Source repository</a></li> <li><a href="https://psmux.github.io/deskvnc/">Official page</a></li> </ul> </nav> <p class="colophon">Every figure on this page is a field returned by a GitHub API call on 9 October 2026 for psmux/DeskVNC. The commands are listed above, and the unedited responses are kept at swarm/wave-03/stats/raw-metrics.json.</p> </div> </footer>

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "WebPage", "name": "DeskVNC by the numbers", "url": "https://deskvnc-hub.pages.dev/by-the-numbers.html", "inLanguage": "en", "dateModified": "2026-10-09", "description": "Live GitHub API figures for psmux/DeskVNC: stars, forks, releases, contributors, release asset downloads, commit cadence, release history and language breakdown.", "isPartOf": { "@type": "WebSite", "name": "DeskVNC agent hub", "url": "https://deskvnc-hub.pages.dev/" }, "about": { "@type": "SoftwareSourceCode", "name": "DeskVNC", "url": "https://github.com/psmux/DeskVNC", "codeRepository": "https://github.com/psmux/DeskVNC", "programmingLanguage": [ { "@type": "ComputerLanguage", "name": "Rust", "description": "8,473,411 bytes, 84.54% of the repository" }, { "@type": "ComputerLanguage", "name": "TypeScript", "description": "1,396,424 bytes, 13.93% of the repository" }, { "@type": "ComputerLanguage", "name": "Python", "description": "85,710 bytes, 0.86% of the repository" }, { "@type": "ComputerLanguage", "name": "Shell", "description": "55,942 bytes, 0.56% of the repository" }, { "@type": "ComputerLanguage", "name": "CSS", "description": "11,120 bytes, 0.11% of the repository" }, { "@type": "ComputerLanguage", "name": "HTML", "description": "382 bytes, 0.00% of the repository" } ], "license": "https://github.com/psmux/DeskVNC/blob/main/LICENSE-MIT", "interactionStatistic": { "@type": "InteractionCounter", "interactionType": "https://schema.org/DownloadAction", "userInteractionCount": 1040 } } } </script>

</body> </html>