lw.Web2App is a cross-platform packer that turns HTML, Vue, React, and Vite static projects into single-file Windows/Linux desktop apps without Node or Electron.
- v0.2.7
- Published at
- Sep 5, 2026
- 129
- Stars
- 409
- Download
- Synced at
- 1d ago
Latest release
v0.2.7Sep 5, 2026, 01:54 AMREADME
Project Overview
lw.Web2App turns static builds of HTML, Vue, React, or Vite projects into a single desktop EXE or ELF, with no Node.js, Rust, or .NET, and no Electron bundled inside. Written in C++, it reuses the WebView2 Evergreen Runtime on Windows and GTK3 plus WebKitGTK 4.1 on Linux, so generated apps stay small and start fast. Windows 10/11 x64 is the stable target while Ubuntu 22.04/24.04 x86_64 is in Linux beta.
Package once and a web project becomes a distributable single-file native desktop app.
| Item | Value |
|---|---|
| Platform | Windows 10/11 x64, Ubuntu 22.04/24.04 x86_64 |
| Language | C++ (MIT license) |
| Input | Local static directory or an http/https URL |
| Output | Single-file EXE (Windows) or ELF (Linux) |
| Runtime needs | No Node.js, Rust, .NET, or Electron on the target machine |
Key Features
- Cross-platform packing: local static directories and online URLs both become single-file apps, with GUI and CLI forms
- Graphical packer: the Windows two-pane layout supports Per-Monitor V2 high DPI with visual settings for app name, version, icon, and window size
- Native IPC: after enabling Native IPC, trusted pages call file pickers, window control, and system tray via window.lw.invoke(), authorized per method
- Backend proxy: requests under the /lw_proxy/ prefix are forwarded same-origin to a fixed HTTP backend, no CORS changes needed, with resumable downloads
- SPA support: history-mode Vue Router and React Router work out of the box, start pages are scanned and sorted automatically
- Integrity and signing: combined SHA-256 over resource ZIP and Manifest, plus optional Authenticode signing from the Windows certificate store
- Single instance: Named Mutex on Windows and flock on Linux, a second launch brings the existing window forward
How It Works
While packing, the tool appends the resource ZIP, Manifest JSON, and an 80-byte Footer to the tail of the Runner PE/ELF, forming a self-contained single file. At runtime, reading the Footer from its own tail switches the program into app mode, only the ZIP central directory is indexed and files are decompressed on request, with small hot resources kept in a 32 MiB LRU cache. Local content is served by an HTTP service bound to 127.0.0.1 only, Host is strictly checked, and dangerous entries such as absolute paths, drive letters, and .. are rejected to lower ZIP-bomb risk.
Target Audience
- Developers shipping web projects as desktop apps
- Teams wrapping internal systems into EXE files
- Frontend engineers who refuse Electron-sized bundles
- Users pinning an online system as a desktop entry
Quick Start
- Download lw.Web2App.exe (Windows) or the matching Ubuntu portable package from Releases
- Open the GUI, pick a local web directory or an online URL on the left, fill in app name, icon, and window size on the right
- Tick Enable local interaction (Native IPC) when local capabilities are needed, then authorize per method in the permission window
- Click generate, output defaults to out/MyWebApp.exe next to the packer, and Explorer opens on success
- Run the generated app, F11 toggles fullscreen and Esc exits
System Requirements
| Item | Requirement |
|---|---|
| Windows | 10 1809+ / 11 x64 with WebView2 Evergreen Runtime |
| Linux | Ubuntu 22.04 / 24.04 x86_64 with GTK3, WebKitGTK 4.1, OpenSSL 3 |
| Source build | Visual Studio 2022 and CMake 3.22+ |
Notes
- Platform limits: Windows 7/8 unsupported, and Debian, Mint, ARM64, or AppImage are not promised on Linux
- Data directory: WebView2 user data sits in %LOCALAPPDATA%/lw.Web2App/apps/
/, deleting it resets cookies and localStorage - Troubleshooting: for a white screen read app.log first and launcher.log if no app directory exists, logs rotate at 2 MiB with 5 kept
- Proxy limits: the backend proxy targets http:// only, WebSocket and NTLM/Kerberos are not supported yet
- URL mode: packing an online URL stores no site content, network is required at runtime