<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/i-ported-kubernetes-to-the-browser-18j6gcfqr" -->

---
title: I ported Kubernetes to the browser | daily.dev
description: A developer at ngrok built webernetes, a TypeScript port of Kubernetes that runs entirely in the browser, generating nearly 100,000 lines of code across 552...
canonical: https://daily.dev/posts/i-ported-kubernetes-to-the-browser-18j6gcfqr
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: I ported Kubernetes to the browser | daily.dev
og:description: A developer at ngrok built webernetes, a TypeScript port of Kubernetes that runs entirely in the browser, generating nearly 100,000 lines of code across 552...
og:url: https://daily.dev/posts/i-ported-kubernetes-to-the-browser-18j6gcfqr
og:image: https://api.daily.dev/og/posts/18j6GcFQr.png
og:image:alt: I ported Kubernetes to the browser
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# I ported Kubernetes to the browser

**[ngrok Blog](https://daily.dev/sources/ngrok)** · 13 min read · 0 upvotes · 0 comments

## Summary

A developer at ngrok built webernetes, a TypeScript port of Kubernetes that runs entirely in the browser, generating nearly 100,000 lines of code across 552 commits in two months using LLMs. It's not a WebAssembly compile of Kubernetes but a from-scratch reimplementation of core components (kubelet, controllers, CNI, CRI, scheduler) intended for building interactive Kubernetes teaching demos rather than production workloads. The author addresses concerns about AI-generated 'slop' by describing a rigorous process: reviewing every line for fidelity to the original Go codebase and writing 204 integration tests plus 1,855 unit tests that assert identical behavior against a real k3s cluster. The post details recurring LLM porting failures (taking shortcuts, over-helpful refactoring, silently dropping test cases) and shares token usage and cost data, including a spike to over $1,800 in API-equivalent costs in the final week.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://ngrok.com/blog/i-ported-kubernetes-to-the-browser>

## Questions this post answers

### How do you verify that LLM-generated code that ports a large codebase like Kubernetes actually behaves correctly?

Write integration tests that run the exact same test code against both the ported implementation and a real reference cluster, such as k3s, using a shared client API like kubernetes-client/javascript. Any behavioral divergence between the port and the real system shows up as a failing test, creating a reliable feedback loop for fixing LLM porting mistakes. Webernetes uses 204 such integration tests alongside 1,855 unit tests ported from the original Go codebase.

_See how developers document real-world LLM-assisted engineering workflows like this one on daily.dev._

### What kinds of mistakes do LLMs commonly make when porting code from one language to another, like Go to TypeScript?

LLMs tend to take shortcuts by substituting simpler data structures (like using a plain Map instead of implementing a specific LRU, FIFO, or expiring cache), invent unnecessary helper functions that diverge subtly from the original logic, and silently omit test cases, especially when porting Go table tests, sometimes only admitting the omission was a mistake when directly questioned.

_Developers weighing LLM-assisted refactors can track porting pitfalls like these on daily.dev._

### Is it possible to compile the full Kubernetes codebase to WebAssembly to run it in the browser?

Compiling all of Kubernetes to WebAssembly runs into compile-time errors because Kubernetes calls system-level APIs unavailable in the browser, and even a minimal 'hello world' Go WebAssembly binary is around 540KiB gzipped, larger than an entire hand-ported browser implementation like webernetes at roughly 140KiB gzipped.

_Developers evaluating WebAssembly feasibility for backend systems can follow deep dives like this on daily.dev._

## Similar posts on daily.dev

- [Running LLM Inference on Kubernetes: What It Actually Takes](https://daily.dev/posts/running-llm-inference-on-kubernetes-what-it-actually-takes-opl6iozrg) · Fairwinds Blog · 0 upvotes · 0 comments

---

Tags: [#testing](https://daily.dev/tags/testing), [#kubernetes](https://daily.dev/tags/kubernetes), [#typescript](https://daily.dev/tags/typescript), [#code-review](https://daily.dev/tags/code-review)

[View this post on daily.dev](https://daily.dev/posts/i-ported-kubernetes-to-the-browser-18j6gcfqr)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"I ported Kubernetes to the browser","url":"https://daily.dev/posts/i-ported-kubernetes-to-the-browser-18j6gcfqr","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/i-ported-kubernetes-to-the-browser-18j6gcfqr"},"datePublished":"2026-08-23T07:21:07.735Z","dateModified":"2026-08-23T07:26:30.065Z","description":"A developer at ngrok built webernetes, a TypeScript port of Kubernetes that runs entirely in the browser, generating nearly 100,000 lines of code across 552...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/ce8c131924b965b6f55394bbb2395bc5?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/ce8c131924b965b6f55394bbb2395bc5?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"ngrok Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"ngrok Blog","logo":"https://media.daily.dev/image/upload/s--718XXxvE--/f_auto,q_auto/v1787469610/logos/ngrok?_a=BAMAMicg0","url":"https://daily.dev/sources/ngrok"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/i-ported-kubernetes-to-the-browser-18j6gcfqr","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"testing,kubernetes,typescript,code-review","timeRequired":"PT13M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"ngrok Blog","item":"https://daily.dev/sources/ngrok"},{"@type":"ListItem","position":3,"name":"I ported Kubernetes to the browser"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/i-ported-kubernetes-to-the-browser-18j6gcfqr#faq","mainEntity":[{"@type":"Question","name":"How do you verify that LLM-generated code that ports a large codebase like Kubernetes actually behaves correctly?","acceptedAnswer":{"@type":"Answer","text":"Write integration tests that run the exact same test code against both the ported implementation and a real reference cluster, such as k3s, using a shared client API like kubernetes-client/javascript. Any behavioral divergence between the port and the real system shows up as a failing test, creating a reliable feedback loop for fixing LLM porting mistakes. Webernetes uses 204 such integration tests alongside 1,855 unit tests ported from the original Go codebase. See how developers document real-world LLM-assisted engineering workflows like this one on daily.dev."}},{"@type":"Question","name":"What kinds of mistakes do LLMs commonly make when porting code from one language to another, like Go to TypeScript?","acceptedAnswer":{"@type":"Answer","text":"LLMs tend to take shortcuts by substituting simpler data structures (like using a plain Map instead of implementing a specific LRU, FIFO, or expiring cache), invent unnecessary helper functions that diverge subtly from the original logic, and silently omit test cases, especially when porting Go table tests, sometimes only admitting the omission was a mistake when directly questioned. Developers weighing LLM-assisted refactors can track porting pitfalls like these on daily.dev."}},{"@type":"Question","name":"Is it possible to compile the full Kubernetes codebase to WebAssembly to run it in the browser?","acceptedAnswer":{"@type":"Answer","text":"Compiling all of Kubernetes to WebAssembly runs into compile-time errors because Kubernetes calls system-level APIs unavailable in the browser, and even a minimal 'hello world' Go WebAssembly binary is around 540KiB gzipped, larger than an entire hand-ported browser implementation like webernetes at roughly 140KiB gzipped. Developers evaluating WebAssembly feasibility for backend systems can follow deep dives like this on daily.dev."}}]}
```

