{"id":51583007,"url":"https://github.com/nexu-io/html-video","last_synced_at":"2026-07-20T20:32:56.793Z","repository":{"id":362291823,"uuid":"1250822765","full_name":"nexu-io/html-video","owner":"nexu-io","description":"Programmatic video for coding agents — HTML to video on your laptop. Turn HTML, CSS \u0026 data into real MP4s with pluggable render engines, 21 templates, AI soundtrack. Apache-2.0, no per-render fees. An official project by the Open Design team.","archived":false,"fork":false,"pushed_at":"2026-06-17T06:08:14.000Z","size":9636,"stargazers_count":3229,"open_issues_count":34,"forks_count":391,"subscribers_count":10,"default_branch":"main","last_synced_at":"2026-06-17T08:09:34.377Z","etag":null,"topics":["ai-agent","apache-2","coding-agent","css","ffmpeg","html","html-to-video","hyperframes","mp4","open-design","open-source","programmatic-video","video","video-as-code","video-generation"],"latest_commit_sha":null,"homepage":"https://open-design.ai/html-video","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nexu-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-27T02:08:11.000Z","updated_at":"2026-06-17T07:48:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nexu-io/html-video","commit_stats":null,"previous_names":["nexu-io/html-video"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nexu-io/html-video","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nexu-io%2Fhtml-video","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nexu-io%2Fhtml-video/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nexu-io%2Fhtml-video/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nexu-io%2Fhtml-video/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nexu-io","download_url":"https://codeload.github.com/nexu-io/html-video/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nexu-io%2Fhtml-video/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35699589,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"ssl_error","status_checked_at":"2026-07-20T02:08:09.736Z","response_time":111,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","apache-2","coding-agent","css","ffmpeg","html","html-to-video","hyperframes","mp4","open-design","open-source","programmatic-video","video","video-as-code","video-generation"],"created_at":"2026-07-11T08:00:23.465Z","updated_at":"2026-07-20T20:32:56.787Z","avatar_url":"https://github.com/nexu-io.png","language":"HTML","funding_links":[],"categories":["HTML"],"sub_categories":[],"readme":"# html-video\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/hero.png\" alt=\"html-video — HTML becomes video, on your laptop\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\n\u003e **HTML becomes video — on your laptop.** Bring your local coding agent (Open Design · Windsurf CLI · Trae CLI · Claude Code · Cursor · Codex · Gemini · Grok · Qwen · OpenCode · Copilot · Aider · Hermes · or the Anthropic API). Describe a video, or **paste an article link / GitHub repo**, and the agent turns it into a multi-frame, fully animated video — then renders it to a real MP4 right on your machine. One agent loop, pluggable rendering engines, a curated template gallery, optional AI soundtrack. Apache-2.0, no per-render fees, no vendor lock-in.\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg alt=\"License\" src=\"https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=flat-square\" /\u003e\u003c/a\u003e\n  \u003ca href=\"#supported-agents\"\u003e\u003cimg alt=\"Agents\" src=\"https://img.shields.io/badge/agents-14%20backends-111?style=flat-square\" /\u003e\u003c/a\u003e\n  \u003ca href=\"#showcase\"\u003e\u003cimg alt=\"Templates\" src=\"https://img.shields.io/badge/templates-21-3ce6ac?style=flat-square\" /\u003e\u003c/a\u003e\n  \u003ca href=\"#turn-a-link-into-a-video\"\u003e\u003cimg alt=\"Sources\" src=\"https://img.shields.io/badge/from-article%20%C2%B7%20repo%20%C2%B7%20prompt-9b59b6?style=flat-square\" /\u003e\u003c/a\u003e\n  \u003ca href=\"#soundtrack\"\u003e\u003cimg alt=\"Soundtrack\" src=\"https://img.shields.io/badge/soundtrack-AI%20music%20%2B%20narration-e67e22?style=flat-square\" /\u003e\u003c/a\u003e\n  \u003ca href=\"#quick-start\"\u003e\u003cimg alt=\"Quickstart\" src=\"https://img.shields.io/badge/quickstart-3%20commands-22a34a?style=flat-square\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003c!-- Built by the team behind Open Design — these link to its community on purpose. --\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/nexu-io/open-design#community\"\u003e\u003cimg alt=\"Discord\" src=\"https://img.shields.io/badge/discord-join-5865f2?style=flat-square\u0026logo=discord\u0026logoColor=white\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://x.com/nexudotio\"\u003e\u003cimg alt=\"Follow @nexudotio on X\" src=\"https://img.shields.io/badge/follow-%40nexudotio-000000?style=flat-square\u0026logo=x\u0026logoColor=white\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/nexu-io/open-design\"\u003e\u003cimg alt=\"By the Open Design team\" src=\"https://img.shields.io/badge/by-nexu--io%2Fopen--design-ff7043?style=flat-square\u0026logo=github\u0026logoColor=white\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eAn official project by the \u003ca href=\"https://open-design.ai\"\u003eOpen Design\u003c/a\u003e team\u003c/b\u003e · \u003ca href=\"https://open-design.ai\"\u003eopen-design.ai\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003cb\u003eEnglish\u003c/b\u003e · \u003ca href=\"README.zh-CN.md\"\u003e简体中文\u003c/a\u003e\u003c/p\u003e\n\n---\n\n## Showcase\n\nEvery template below is a real, animated single-file HTML video — these are live renders, not mockups. Drop one in, let the agent fill it with your content, export to MP4.\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"docs/assets/templates/frame-data-chart-nyt.png\" alt=\"NYT-style data chart\" /\u003e\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"docs/assets/templates/frame-glitch-title.png\" alt=\"Glitch title\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eframe-data-chart-nyt\u003c/b\u003e · data-viz\u003cbr/\u003eEditorial NYT-style animated line chart — headline, annotated data points, source line. For \"the number went up\" stories.\u003c/td\u003e\n\u003ctd\u003e\u003cb\u003eframe-glitch-title\u003c/b\u003e · title card\u003cbr/\u003eChromatic-aberration glitch title with scanlines. For openers, drops, and \"system online\" energy.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"docs/assets/templates/frame-liquid-bg-hero.png\" alt=\"Liquid background hero\" /\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"docs/assets/templates/frame-light-leak-cinema.png\" alt=\"Light leak cinema\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003eframe-liquid-bg-hero\u003c/b\u003e · hero\u003cbr/\u003eAurora liquid-gradient hero with a centered headline. For product reveals and bold statements.\u003c/td\u003e\n\u003ctd\u003e\u003cb\u003eframe-light-leak-cinema\u003c/b\u003e · cinematic\u003cbr/\u003eWarm film-grain + light-leak cinematic frame. For mood, brand films, \"a quiet year\" storytelling.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"docs/assets/templates/vfx-text-cursor.png\" alt=\"Typewriter cursor VFX\" /\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"docs/assets/templates/frame-logo-outro.png\" alt=\"Logo outro\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cb\u003evfx-text-cursor\u003c/b\u003e · VFX\u003cbr/\u003eTypewriter text with a blinking terminal cursor. For code-style reveals and CLI demos.\u003c/td\u003e\n\u003ctd\u003e\u003cb\u003eframe-logo-outro\u003c/b\u003e · outro\u003cbr/\u003eClean animated logo end card. For sign-offs and brand stamps at the end of any video.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n…and 15 more, including multi-scene product promos, kinetic type, Swiss-grid and Vignelli data cards, decision-tree explainers, Takram-organic motion, and warm-grain editorial. Browse all 21 live in the studio gallery.\n\n---\n\n## Why this exists\n\nHTML→Video is a real category — but every engine is opinionated, and each wants you to learn *its* authoring model:\n\n| Engine | Paradigm | Tradeoff | In html-video |\n|---|---|---|---|\n| [Hyperframes](https://github.com/heygen-com/hyperframes) | HTML + CSS + GSAP, agent-skill driven | Single rendering paradigm | ✅ **Shipped** — the default engine; renders real MP4 via headless Chromium + ffmpeg |\n| [Remotion](https://www.remotion.dev/) | React components | Source-available, paid above 4 devs | 🗺️ Planned |\n| [Motion Canvas](https://github.com/motion-canvas/motion-canvas) · [Revideo](https://github.com/redotvideo/revideo) | TypeScript generators on canvas | Best for explainers, code-first | 🗺️ Planned |\n| [Manim](https://github.com/3b1b/manim) \u0026 friends | Math / 3D first | Niche | 🗺️ Researching |\n\nPicking the right engine per use case, learning each model, and stitching them into one workflow costs real engineering time. Most teams pick one and live with its limits.\n\n**html-video is the meta-layer that sits above all of them.** You talk to your agent; it picks the engine, picks the template, fills in your content, and renders the video. The engine is an implementation detail behind a single adapter interface — one `render(input, ctx)` contract that any backend can satisfy. Add a new engine and every template, every agent, and the whole studio workflow get it for free. No new DSL to learn, no rewrite when you switch engines.\n\nThe same idea powers [Open Design](https://github.com/nexu-io/open-design) in the *design* space — an agent meta-layer over many tools. html-video is the *motion* counterpart from the same team.\n\n\u003e **Status:** the pluggable-engine architecture is in place, and the **Hyperframes engine is fully wired up and renders real MP4** — headless Chromium records the animated HTML frame-by-frame and ffmpeg encodes it (libx264). Remotion, Motion Canvas / Revideo, and Manim are on the roadmap: the adapter interface is designed for them, but their adapters aren't built yet. The \"In html-video\" column above is the single source of truth for what's actually runnable today.\n\n---\n\n## At a glance\n\n| | |\n|---|---|\n| **Coding agents (14)** | Open Design (Vela) · Windsurf CLI · Trae CLI · Claude Code · Cursor Agent · Codex CLI · Gemini CLI · Grok Build · Qwen Code · OpenCode · GitHub Copilot CLI · Aider · Hermes · Anthropic Messages API — auto-detected on your `PATH`, switchable from the top bar. |\n| **Real MP4 render** | Headless Chromium records the animated HTML and ffmpeg encodes it (libx264) — locally, no cloud render, no per-clip fee. |\n| **Article / repo → video** | Paste a URL or GitHub repo; the studio fetches it server-side (handles WeChat 公众号 articles) and builds the video from the real content. |\n| **21 templates** | Curated, license-clean patterns: data viz, product promos, social shorts, explainers, kinetic type, transitions — previewed live in the gallery. |\n| **Multi-frame storyboards** | A content-graph drives multi-scene videos; edit per-frame text inline, reorder, re-render. |\n| **AI soundtrack** | Optional background music + narration via MiniMax, mixed into the MP4 at export. |\n| **Studio + CLI** | A local browser studio *and* a scriptable `html-video` CLI. |\n| **License** | Apache-2.0 — no per-render fees, no seat caps, no contributor agreements. |\n\n---\n\n## How it works\n\nOne sentence (or one link) goes in; a real MP4 comes out. The pipeline is the same whether you start from a prompt, an article, or a repo:\n\n```\n  prompt / link / repo\n        │\n        ▼\n  ① source fetch        studio pulls the URL or repo server-side, flattens it to Markdown\n        │\n        ▼\n  ② agent loop          your agent reads the material + the picked template's style and emits\n        │               a content-graph (the storyboard) + one HTML block per frame\n        ▼\n  ③ content-graph       multi-frame IR — nodes (entity / data / text) + edges (sequence /\n        │               dependency / contrast); topo-sorted into frame order \u0026 timing\n        ▼\n  ④ per-frame HTML      each node becomes a self-contained animated HTML frame on disk\n        │\n        ▼\n  ⑤ Hyperframes render  headless Chromium loads each frame, records it (auto-extending to\n        │               cover the frame's own animation), → webm per frame\n        ▼\n  ⑥ ffmpeg              each webm → mp4 (libx264), then concat into one video;\n        │               optional MiniMax music + narration mixed in\n        ▼\n      your.mp4\n```\n\nSteps ②–④ are where the \"meta-layer\" lives: the agent decides the storyboard and the engine decides how to draw it, and neither leaks into the other. Step ⑤ is engine-specific — swapping in Remotion or Motion Canvas later replaces only that box, leaving the storyboard and the agent loop untouched. Everything runs on your machine; the only network calls are the optional source fetch and the optional soundtrack.\n\nSingle-frame videos take a fast path that skips the content-graph — one template, one HTML, straight to render.\n\n---\n\n## Turn a link into a video\n\nThis is what most people reach for: hand your agent a link, get a video back. The agents run as local CLIs with no network access of their own, so the studio fetches the source **server-side** and feeds the real content into the generation prompt — no copy-pasting article bodies, and pages behind a login-free server render (like WeChat 公众号) just work.\n\n```\nYou:   做一个解读视频  https://mp.weixin.qq.com/s/…\nAgent: 好，我读完了《用嘴剪视频的时代来了？…》这篇文章 — 这就基于它生成。下一步选风格。\n→      multi-frame explainer, built from the article's actual points\n```\n\n- **Web article** → fetched and flattened to Markdown. Server-rendered pages like **WeChat 公众号** articles work out of the box.\n- **GitHub repo** → description, top-level structure, and README pulled via the public API — great for \"explain this open-source project\" videos.\n- **Just a prompt** → describe the topic and the agent writes the content from scratch.\n\nWhatever the source, it becomes the material the video is actually built from — not decoration around a canned template. The agent reads the fetched content, decides how many scenes it needs, and writes a **content-graph storyboard**: the key points become frames, the relationships between them (this follows that, this contrasts with that) become edges, and the picked template's visual style is applied per frame. So a 1,500-word article turns into a paced multi-scene explainer whose every line traces back to something in the source, and a repo turns into a structured walkthrough of what the project actually is.\n\n---\n\n## Quick start\n\n### Prerequisites\n\n| Requirement | Minimum | Check |\n|---|---|---|\n| **Node.js** | 20+ | `node --version` |\n| **pnpm** | 9+ | `pnpm --version` |\n| **ffmpeg** | Any recent | `ffmpeg -version` |\n| **Chromium** (or Playwright browsers) | — | `npx playwright install chromium` |\n\nThe default rendering engine records animated HTML in a headless Chromium browser, then uses ffmpeg (libx264) to encode MP4. Install Playwright's Chromium if you don't have a system install:\n\n```bash\nnpx playwright install chromium\n```\n\n### Install \u0026 run\n\n```bash\npnpm install\npnpm -r build\nnode packages/cli/dist/bin.js studio    # opens the studio at http://127.0.0.1:3071\n```\n\nIn the studio: pick a template (or just describe a video / paste a link), chat with your agent, edit per-frame text, add a soundtrack, and export MP4.\n\nCLI utilities:\n\n```bash\nnode packages/cli/dist/bin.js doctor                 # detect installed agents + engines\nnode packages/cli/dist/bin.js search-templates --intent \"github stars race\" --top 3\n```\n\n---\n\n## Supported agents\n\nAuto-detected on your `PATH`; switch the active one from the studio's top bar. The studio leads with **Open Design (Vela)** — one login, many models, lower cost — then falls back to the first *available* agent so a fresh project always has a working backend.\n\n| Agent | Detection | Invocation |\n|---|---|---|\n| **Open Design (Vela)** | `vela` / bundled in the Open Design app | ACP over stdio — one login in Open Design, pick any model |\n| **Windsurf CLI** | `windsurf` | `windsurf --yolo`, ACP over stdio |\n| **Trae CLI** | `traecli` | `traecli acp serve --yolo`, ACP over stdio |\n| **Claude Code** | `claude` | `claude --print`, prompt via stdin |\n| **Cursor Agent** | `cursor-agent` | `cursor-agent --print` |\n| **Codex CLI** | `codex` | `codex exec`, prompt via stdin |\n| **Hermes** | `hermes` | Hermes ACP CLI |\n| **Gemini CLI** | `gemini` | Prompt via stdin |\n| **Grok Build** | `grok` | `grok -p \u003cprompt\u003e` |\n| **Qwen Code** | `qwen` | Prompt via stdin |\n| **OpenCode** | `opencode` | `opencode run`, prompt via stdin |\n| **GitHub Copilot CLI** | `copilot` | `copilot --allow-all-tools`, prompt via stdin |\n| **Aider** | `aider` | `aider --message \u003cprompt\u003e` |\n| **Anthropic API** | BYOK | Direct Messages API — works with no CLI installed |\n\nNothing installed? Set an Anthropic key and the studio talks to the Messages API directly.\n\n---\n\n## Soundtrack\n\nGive the finished video a voice. In **Settings → Audio**, add a MiniMax API key, then in the per-project **Soundtrack** panel:\n\n- **Background music** — describe a mood (`calm cinematic ambient, slow build`); MiniMax generates an instrumental track.\n- **Narration** — type a script; MiniMax reads it (TTS).\n\nBoth are mixed into the exported MP4 (music ducked under the voice, optional fade-in/out) via ffmpeg. No key configured? The rest of the studio works unchanged.\n\n---\n\n## Template gallery\n\nThe 21 templates aren't a random grab-bag — each one is a self-contained, agent-readable unit described by a `template.html-video.yaml` manifest the studio scans at startup. A manifest carries everything the agent needs to pick and drive the template without opening the HTML:\n\n- **What it's for** — `category`, `tags`, and a `best_for` list (e.g. *\"Corporate slide\"*, *\"Minimal report card\"*) that `search-templates` matches your intent against.\n- **What it outputs** — supported resolutions, aspect ratios, fps, duration bounds, whether it has an alpha channel or audio.\n- **What goes in** — an `inputs` JSON schema, so the agent knows exactly which text/data slots to fill.\n- **License provenance** — an SPDX id plus explicit `attribution_required` / `redistribution_allowed` / `commercial_use` flags, and an `assets_attribution` block pointing at the upstream source URL.\n\nThat last part is deliberate. Every template is **license-clean by construction**: forks carry their original license, the repo-root [`NOTICE.md`](templates/NOTICE.md) records each source and SPDX, and nothing without a clear permissive license ships. So you can put any of them in commercial work without an audit. Templates span data viz (NYT-style charts, Swiss/Vignelli grids), titles \u0026 VFX (glitch, kinetic type, typewriter cursor), heroes \u0026 cinematics (liquid gradients, light-leak, warm grain), product promos (15s / 30s multi-scene), and explainer scaffolds (decision trees) — and the format is open, so community templates drop in the same way.\n\n---\n\n## Architecture\n\n```\npackages/\n├── core/                  Project / Asset / ContentGraph types, registries, orchestrator,\n│                          MiniMax provider + ffmpeg audio mux\n├── content-graph/         Multi-frame storyboard IR (nodes + edges, topo-sort)\n│ runtime/               Agent runtime — detect / spawn / stream\n│                          (Open Design/Vela · Windsurf CLI · Trae CLI · Claude · Cursor · Codex · Gemini · Grok · Qwen · OpenCode · Copilot · Aider · Hermes · Anthropic API)\n├── adapter-hyperframes/   Hyperframes engine adapter — real render via Chromium + ffmpeg\n├── cli/                   `html-video` command + the studio HTTP server + source fetching\n└── project-studio/        Browser studio UI (chat, template gallery, frames, soundtrack, export)\ntemplates/                 21 curated, license-clean video templates\nresearch/                  RFCs (engine adapter / template metadata / agent skill / content-graph)\n```\n\n---\n\n## Roadmap\n\n- [x] Engine adapter spec — one interface, N backends\n- [x] Template metadata format — license-first, agent-readable\n- [x] Multi-frame storyboard workflow (content-graph)\n- [x] Studio: live template gallery, agent switcher, per-frame text editing\n- [x] Source material: article / GitHub-repo → video\n- [x] AI soundtrack (MiniMax music + narration), mixed at export\n- [x] Real MP4 render — Hyperframes engine via headless Chromium + ffmpeg\n- [x] Agent model selection — Open Design (Vela) backend, live model catalog\n- [ ] Adapters for Remotion / Motion Canvas / Revideo\n- [ ] Agent skill packages + a template marketplace\n\n---\n\n## References \u0026 lineage\n\n| Project | Role here |\n|---|---|\n| [Open Design](https://github.com/nexu-io/open-design) | Sister project — the design-agent meta-layer; same team, shared philosophy |\n| [HTML Anything](https://github.com/nexu-io/html-anything) | Sister project — HTML for *static* deliverables; html-video is the *motion* side |\n| [Hyperframes](https://github.com/heygen-com/hyperframes) | The shipped engine adapter; the HTML+CSS+GSAP rendering paradigm and the source of several Apache-2.0 templates |\n\n## License\n\n[Apache-2.0](LICENSE)\n\n## Built by\n\n[nexu-io](https://github.com/nexu-io) — the team behind [Open Design](https://github.com/nexu-io/open-design). Join the [Discord](https://github.com/nexu-io/open-design#community) · follow [@nexudotio](https://x.com/nexudotio).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnexu-io%2Fhtml-video","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnexu-io%2Fhtml-video","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnexu-io%2Fhtml-video/lists"}