{
  "schema": "tesign-radar/item/1",
  "generated_at": "2026-09-17T01:56:13.055Z",
  "lang": "en",
  "slug": "esp-kvm",
  "url": "https://tesign.com/en/item/esp-kvm/",
  "alternates": {
    "ko": {
      "html": "https://tesign.com/item/esp-kvm/",
      "json": "https://tesign.com/item/esp-kvm/index.json",
      "markdown": "https://tesign.com/item/esp-kvm/index.md"
    },
    "en": {
      "html": "https://tesign.com/en/item/esp-kvm/",
      "json": "https://tesign.com/en/item/esp-kvm/index.json",
      "markdown": "https://tesign.com/en/item/esp-kvm/index.md"
    }
  },
  "name": "ESP-KVM",
  "use_label": "Build-your-own remote KVM",
  "one_liner": "ESP32-P4 IP-KVM: a PC's BIOS screen, keyboard and mouse in a browser, about $40 in parts",
  "text": {
    "why": "Remote desktop needs a running OS; this board plugs into the target's HDMI output and a USB port and shows the BIOS, boot menu or a machine with no OS at all in a browser. It is built from an ESP32-P4 board and a Toshiba TC358743 HDMI-to-CSI bridge (Geekworm C790), and the homepage puts the parts at about $40. Measured at 1080p: MJPEG 20 fps on the Waveshare ESP32-P4-ETH, H.264 22–24 fps on the Function EV (rev 3.2). Virtual-media boot, Wake-on-LAN, ATX power control, Home Assistant over MQTT and WireGuard/Tailscale are included; it flashes from the browser, latest release v0.48.0 (2026-09-14).",
    "take": "It earns its keep exactly where remote desktop dies, and fills that gap with $40 of parts and a browser flasher — but take the author's 'do not put this on the public internet' literally.",
    "build": [
      "Fit one to each homelab server or mini-PC as a stand-in for a BMC, or combine runbooks (a macro that waits for 'Press F2' on screen, then presses F2) with the cron scheduler for text-screen jobs such as BIOS setup and boot menus, and for overnight checks."
    ],
    "who": [
      {
        "role": "Homelab and mini-PC owners",
        "situation": "enter the BIOS and reinstall an OS remotely"
      },
      {
        "role": "Home Assistant users",
        "situation": "MQTT auto-discovery exposes a screen still, power buttons and sensors"
      },
      {
        "role": "Embedded developers working with the ESP32-P4 or HDMI capture",
        "situation": "TC358743 bring-up and CSI register code to study"
      }
    ],
    "start": [
      {
        "command": false,
        "text": "1. Download your board's espkvm-<version>-<board>-merged.bin from Releases (e.g. -p4-eth-, -funcev-)"
      },
      {
        "command": false,
        "text": "esptool --chip esp32p4 -b 921600 write-flash 0x0 espkvm-<version>-<board>-merged.bin"
      },
      {
        "command": false,
        "text": "# or flash straight from Chrome/Edge at https://espkvm.io/flash/"
      },
      {
        "command": false,
        "text": "2. Connect Ethernet, HDMI from the target and the board's USB 2.0 OTG-HS port to the target, then open https://espkvm.local/"
      },
      {
        "command": false,
        "text": "3. Sign in as admin / admin → the console will not continue until the password is changed"
      }
    ],
    "caveat": [
      "Apache-2.0; the author notes H.264 is patent-encumbered whatever licence the code carries",
      "Hardware: an ESP32-P4 board with 32 MB PSRAM and 16 MB flash plus a TC358743 capture board (Geekworm C790) — about $40 per the homepage; chip revision (below/above 3.0) changes the build",
      "No security review yet, so keep it off the public internet (VPN built in); HDMI audio not implemented; H.264, keyboard and mouse need HTTPS with the device CA trusted"
    ]
  },
  "cta": {
    "type": "self_host",
    "label": "SELF-HOST",
    "url": "https://espkvm.io/"
  },
  "ready": "self-host",
  "categories": [
    "hardware",
    "infra"
  ],
  "categories_confirmed": true,
  "tags": [
    "ip-kvm",
    "esp32-p4",
    "hdmi-capture",
    "homelab",
    "esp-idf",
    "home-assistant"
  ],
  "platform": [
    "web"
  ],
  "license": {
    "spdx": "Apache-2.0",
    "scope": "permissive",
    "scope_text": "Commercial use, redistribution OK. Keep notices; mark changes.",
    "url": "https://spdx.org/licenses/Apache-2.0.html",
    "note": null,
    "open_source": true
  },
  "language": "C",
  "source_urls": {
    "canonical": "https://espkvm.io/",
    "github": "https://github.com/espkvm/espkvm",
    "huggingface": null,
    "app_store": null,
    "sightings": [
      {
        "source": "github",
        "url": "https://github.com/espkvm/espkvm",
        "posted_at": "2026-09-11T14:00:00.000Z",
        "hn_url": null
      }
    ]
  },
  "numbers": {
    "as_of": "2026-09-16T21:00:00.000Z",
    "stars": 422,
    "stars_unit": "GitHub stars",
    "stars_checked_at": "2026-09-15T19:35:24.834Z",
    "stars_observed_since_check": 0,
    "star_delta_24h": null,
    "star_delta_7d": 12,
    "star_delta_30d": 12,
    "star_delta_unit": "GitHub stars gained in the window, GH Archive events summed to as_of",
    "spark_14d": [
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      2,
      4,
      6,
      null,
      null,
      null
    ],
    "hf_likes": null,
    "hf_likes_observed_at": null,
    "hn_points": null,
    "hn_points_observed_at": null,
    "store": null,
    "method": "Star total = the value last checked on GitHub (stars_checked_at) + increases observed via GH Archive since. The 24h · 7d · 30d gains are GH Archive hourly events summed to the reference time (as_of). No score of ours."
  },
  "ranks": null,
  "activity": {
    "pushed_at": "2026-09-15T16:53:23.000Z",
    "owner_type": "Organization",
    "open_issues": 2,
    "contributors": 4,
    "releases_count": 81,
    "latest_release": {
      "tag": "v.0.49.0",
      "published_at": "2026-09-15T17:02:26.000Z",
      "prerelease": false
    },
    "checked_at": "2026-09-15T19:35:24.834Z",
    "core_checked_at": "2026-09-15T19:35:24.834Z"
  },
  "signals": [
    {
      "kind": "back",
      "label": "BACK CATALOG",
      "value": null
    }
  ],
  "images": {
    "og": "https://tesign.com/img/esp-kvm-d27aaf95fb.png",
    "cover": "https://tesign.com/img/esp-kvm-d27aaf95fb.png",
    "cover_width": 2400,
    "cover_height": 1260,
    "gallery": [
      "https://tesign.com/img/esp-kvm-d27aaf95fb.png",
      "https://tesign.com/img/esp-kvm-684b0ecfa8.png",
      "https://tesign.com/img/esp-kvm-2af3c5639a.webp",
      "https://tesign.com/img/esp-kvm-c6105a3a10.png"
    ],
    "alt": "The ESP-KVM browser console driving a real machine: its desktop with a right-click menu open, the live status bar and the video settings panel",
    "tier": 1
  },
  "dates": {
    "first_seen_at": "2026-09-13T09:56:24.840Z",
    "source_created_at": "2026-07-22T20:25:01.000Z",
    "discovery_hours": 1261.5232888888888,
    "launch_signal_at": "2026-09-11T14:00:00.000Z",
    "kept_at": "2026-09-14T19:27:43.595Z",
    "first_published_at": "2026-09-14T19:27:43.743Z",
    "updated_at": "2026-09-15T04:36:56.864Z",
    "ingestion_mode": "backfill"
  },
  "notes": [
    "This file was produced by the same build, from the same data, as the tesign.com item page. The text is editorial; the numbers are stored observations.",
    "null in the JSON means not observed — never zero. The Markdown writes [unconfirmed] for it.",
    "Star total = the value last checked on GitHub (stars_checked_at) + increases observed via GH Archive since. The 24h · 7d · 30d gains are GH Archive hourly events summed to the reference time (as_of). No score of ours.",
    "Reconstructed from archive data, not a live discovery.",
    "A summary, not legal advice."
  ]
}
