Spaces:
Running
Running
| <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’s prompts run on the host’s GPU.</span> | |
| <a href="https://github.com/abgnydn/zero-tvm">github.com/abgnydn/zero-tvm ↗</a> | |
| </div> | |
| </div> | |
| </footer> | |
| </body> | |
| </html> | |