zero-tvm / index.html
abgunaydin's picture
sync from github@30b8f47
e26c434
Raw
History Blame Contribute Delete
7.13 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>zero-tvm — LLM inference in the browser, on hand-written WGSL</title>
<meta name="description" content="zero-tvm is an LLM inference engine written by hand in WGSL and TypeScript. It runs entirely in the browser: weights download once, cache locally, and inference runs on your own GPU.">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="canonical" href="https://zerotvm.com/">
<meta property="og:type" content="website">
<meta property="og:url" content="https://zerotvm.com/">
<meta property="og:title" content="zero-tvm — LLM inference in the browser, on hand-written WGSL">
<meta property="og:description" content="An LLM inference engine written by hand in WGSL and TypeScript. Weights download once, cache locally, and inference runs on your own GPU.">
<!-- The canonical URL is the one that actually gets posted, and it was the
only page declaring summary_large_image without an image to put in it —
so every share of https://zerotvm.com/ unfurled as a bare text card
while /docs.html unfurled richly. og.png ships already. -->
<meta property="og:image" content="https://zerotvm.com/og.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://zerotvm.com/og.png">
<meta name="twitter:title" content="zero-tvm — LLM inference in the browser, on hand-written WGSL">
<meta name="twitter:description" content="An LLM inference engine written by hand in WGSL and TypeScript. Weights download once, cache locally, and inference runs on your own GPU.">
<link rel="preload" href="/entrance/bg.svg" as="image" type="image/svg+xml">
<link rel="preload" href="/entrance/ring.svg" as="image" type="image/svg+xml">
<link rel="preload" href="/fonts/f3-fraunce.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/f4-plinean.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/fonts.css">
<link rel="stylesheet" href="/tokens.css">
<!-- chat-ui.css: the shared message surface — ENTER opens the chat IN the
entrance (landing-chat.ts), so this page renders bubbles and the
composer too. Before landing.css, which carries the panel chrome. -->
<link rel="stylesheet" href="/chat-ui.css">
<link rel="stylesheet" href="/landing.css">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareSourceCode",
"name": "zero-tvm",
"url": "https://zerotvm.com/",
"description": "An LLM inference engine written by hand in WGSL and TypeScript, running entirely in the browser.",
"programmingLanguage": [
"WGSL",
"TypeScript"
],
"codeRepository": "https://github.com/abgnydn/zero-tvm",
"license": "https://opensource.org/licenses/MIT",
"isPartOf": {
"@type": "Collection",
"name": "WebGPU research line",
"url": "https://kernelfusion.dev"
},
"author": {
"@type": "Person",
"name": "Ahmet Barış Günaydın",
"url": "https://zerotvm.com/",
"sameAs": [
"https://barisgunaydin.com",
"https://github.com/abgnydn",
"https://huggingface.co/abgunaydin",
"https://x.com/abgnydn_",
"https://www.linkedin.com/in/abgnydn/"
]
}
}
</script>
<script type="module" crossorigin src="/assets/index-BqNbylMY24.js"></script>
<link rel="modulepreload" crossorigin href="/assets/model-registry-BoK-ObgACo.js">
<link rel="modulepreload" crossorigin href="/assets/preload-helper-ckwbz45pO3.js">
<link rel="modulepreload" crossorigin href="/assets/mascot-BCKWddkWrV.js">
<link rel="modulepreload" crossorigin href="/assets/feats-dlBfBxqpI8.js">
</head>
<body>
<nav class="nav">
<div class="wrap nav-in">
<a href="/" class="nav-logo">zero<span>-tvm</span></a>
<div class="nav-links">
<a href="#models">Models</a>
<!-- "Rooms" pointed at share.html's bare host page (a floating modal
over black). Hosting lives in the entrance now — enter a character,
then ⟁ Room. share.html remains the GUEST surface links point at,
and the footer still lists it. -->
<!-- "Agent" was here. agent-host.html only works against a local
agent-server on 127.0.0.1:8017, so a public visitor paid a ~2 GB
download for a page that then sat on "booting…" forever. It is a
repo workflow (`npm run agent`), documented in the README, not a
destination on the site. -->
<a href="docs.html#vs-webllm">Proof</a>
<a href="docs.html">Docs</a>
<!-- "Open chat →" left with the in-place chat: the page below IS the
chat entrance, and the CTA duplicated ENTER while routing through
the old standalone gate. zero-tvm.html remains the deep-link
surface (footer, docs, ?model= links). -->
</div>
</div>
</nav>
<section id="models">
<!-- The game entrance. Full-viewport character select — landing.ts renders
the whole screen (splash, stage, roster, sheet) into this root. Every
figure and number still comes from the registry; the scroll below keeps
the essay and the kernel window for the reader who wants the why. -->
<div id="model-browser" class="cs-root"></div>
</section>
<!-- The page IS the character select now — nav above, footer below,
nothing between. The essay, the kernel window and the deep copy left
with the 2026-08-15 entrance redesign; docs.html carries the why. -->
<footer>
<div class="wrap">
<div class="foot-grid">
<div>
<a href="/" class="nav-logo">zero<span>-tvm</span></a>
<p class="foot-about">
An LLM inference engine written by hand in WGSL and TypeScript. Part
of a research line on WebGPU kernels by Ahmet Barış Günaydın.
</p>
</div>
<div>
<h4>This site</h4>
<ul>
<li><a href="zero-tvm.html">Chat</a></li>
<li><a href="share.html">Host a room</a></li>
<li><a href="docs.html">Docs</a></li>
<li><a href="docs.html#vs-webllm">Proof</a></li>
<li><a href="validate.html">Validate</a></li>
</ul>
</div>
<div>
<h4>Research line</h4>
<ul id="sibling-links">
<li><a href="https://kernelfusion.dev">kernelfusion.dev</a></li>
<li><a href="https://github.com/abgnydn">github.com/abgnydn</a></li>
<li><a href="https://huggingface.co/abgunaydin">huggingface.co/abgunaydin</a></li>
</ul>
</div>
</div>
<div class="foot-bottom">
<span>MIT licensed · weights are fetched once from HuggingFace and cached in your browser; prompts and generation stay on your machine in the chat. In a room, a guest&rsquo;s prompts run on the host&rsquo;s GPU.</span>
<a href="https://github.com/abgnydn/zero-tvm">github.com/abgnydn/zero-tvm ↗</a>
</div>
</div>
</footer>
</body>
</html>