# `cargo html`
create self-contained HTML programs
[](https://github.com/MaulingMonkey/cargo-html)
[](https://crates.io/crates/cargo-html)
[](https://gist.github.com/MaulingMonkey/c81a9f18811079f19326dac4daa5a359#minimum-supported-rust-versions-msrv)
[](https://github.com/MaulingMonkey/cargo-html)
[](https://github.com/MaulingMonkey/cargo-html/actions?query=workflow%3Arust)
Want to run basic console programs in the browser?<br>
Too lazy to configure CORS properly to fetch/share WASM?<br>
Hate firing up a webserver when you'd rather just double click an HTML file?<br>
Easily confused by advanced concepts such as "I have multiple files"?<br>
`cargo html` solves all of this, by generating .html files which embed and encode their javascript, WASM, and WASI implementations directly into said HTML. No CORS, no `--allow-file-access-from-files` flags, no [sidecar files](https://en.wikipedia.org/wiki/Sidecar_file), 100% self contained.
<h2 name="quickstart">Quickstart</h2>
```sh
# install
cargo install cargo-html
# create a project
cargo new hello-world
cd hello-world
# build a project
cargo html
# view/run said project in the browser
start "" target/wasm32-wasi/debug/hello-world.html
```
<h2 name="examples">Examples</h2>
### rust-mini-games
* as mentioned on HN: https://news.ycombinator.com/item?id=26089539
* upstream: https://github.com/Syn-Nine/rust-mini-games
* patches: https://github.com/MaulingMonkey/rust-mini-games
| [asylum](https://maulingmonkey.com/rust-mini-games/asylum.html)
| [guess](https://maulingmonkey.com/rust-mini-games/guess.html)
| [knights](https://maulingmonkey.com/rust-mini-games/knights.html) | [#6](https://github.com/MaulingMonkey/cargo-html/issues/6) File I/O not implemented (panic on exit)
| [lord](https://maulingmonkey.com/rust-mini-games/lord.html) | [#7](https://github.com/MaulingMonkey/cargo-html/issues/7) Colors not supported (some terminal escape garbage)
| [rps](https://maulingmonkey.com/rust-mini-games/rps.html)
| [tictactoe](https://maulingmonkey.com/rust-mini-games/tictactoe.html)
To reproduce the `gh-pages` of my fork of that repository from scratch:
```sh
# init
cargo install cargo-html
git clone --branch cargo-html-demo https://github.com/MaulingMonkey/rust-mini-games
cd rust-mini-games
# build
cargo html --release
robocopy /S target/wasm32-wasi/release . *.html
# create branch
git checkout -b gh-pages
git add -A .
git commit -m "Updated examples"
```
<h2>Portability</h2>
Requires
[wasm](https://caniuse.com/wasm),
[async-functions](https://caniuse.com/async-functions),
[promises](https://caniuse.com/promises),
[textencoder](https://caniuse.com/textencoder),
and being generally awesome.
| Chrome | ✅ 57+
| Chrome for Android | ✅ 88+
| Firefox | ✅ 53+
| Firefox for Android | ✔️ 83+
| Opera | ✔️ 44+
| Opera Mobile | ✔️ 59+
| Opera Mini | ❌ None (missing WASM, Async Functions, TextEncoder)
| Safari | ✔️ 11+
| iOS Safari | ✔️ 11+
| Edge | ✅ 79+
| IE | ❌ None (missing WASM, Async Functions, TextEncoder)
| Android Browser | ✔️ 81+
| UC Browser for Android| ❌ None (missing WASM)
| Samsung Internet | ✅ 7.2+
| QQ Browser | ✔️ 10.4+
| Baidu Browser | ❌ None (missing WASM, Async Functions)
| KaiOS Browser | ❌ None (missing WASM, Async Functions)
| Windows | ✅ | ✔️ | ❌ | ❌ | ❌ \[...\]
| Linux | ✅ | ✔️ | ✔️ | ✔️ | ❌ \[...\]
| OS X | ✔️ | ❌ | ❌ | ❌ | ❌ \[...\]
| ✅ | Tested
| ✔️ | Should work
| ❌ | Broken (Browsers could probably be fixed via polyfills and different codegen?)
<h2 name="license">License</h2>
Licensed under either of
* Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
<h2 name="contribution">Contribution</h2>
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.