diff --git a/CHANGELOG.md b/CHANGELOG.md
index 43c7491..3ed8884 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,67 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [0.0.39] - 2026-08-03
+
+### Changed
+
+- **Windows no longer ships an application.** 1Helm on Windows now runs the
+ ordinary Linux build inside a WSL 2 distribution and serves its interface to
+ the browser at `http://localhost:8123`. Install it with one command in an
+ ordinary PowerShell window:
+
+ ```powershell
+ irm https://1helm.com/install.ps1 | iex
+ ```
+
+ There is no Electron host, no Squirrel installer, no `.exe`, and therefore
+ nothing to code-sign — so SmartScreen never appears. Windows publishes no
+ release artifacts; the desktop matrix is now three files (macOS DMG, macOS
+ updater ZIP, Linux archive), and the Linux archive serves both Linux and
+ Windows.
+- Windows setup asks for administrator approval once, to enable the WSL 2
+ optional features and install Microsoft's digest- and signature-verified WSL
+ package. Everything else — importing the distribution, installing 1Helm,
+ registering the keepalive — runs as the signed-in user, because WSL state is
+ per-user.
+- Windows requires one restart partway through setup, which Windows itself
+ demands before WSL 2 becomes usable. Setup reports that as a restart with
+ numbered steps rather than a failure, and re-running the same command
+ continues from where it stopped.
+- `#main`'s terminal on Windows is now bash inside the distribution rather than
+ `cmd.exe`, matching Linux.
+- Removing 1Helm from Windows is `irm https://1helm.com/uninstall.ps1 | iex`.
+
+### Fixed
+
+- Windows file operations are roughly four times faster. Every channel storage
+ operation previously crossed the Windows-to-WSL boundary through
+ `wsl.exe`, costing a flat ~208 ms per call — measured at 281 ms versus 73 ms
+ for the same work without the crossing. Those crossings no longer exist,
+ because the server now runs inside the distribution.
+- The Windows interface can no longer freeze. Those boundary crossings were
+ synchronous calls on the Electron main thread, which is the thread Windows
+ requires for its message pump, so a file listing could stall the window past
+ the five seconds after which Windows reports "not responding". There is no
+ longer a window to freeze: the browser waits on an HTTP request instead.
+- Linux and Windows installs no longer build 1Helm on the target machine. The
+ release archive now ships production dependencies and prebuilt assets, with
+ native addons compiled against an older glibc and verified on arrival by
+ loading each one and checking its Node ABI. A cold install went from 8m49s to
+ 3m40s, and no C/C++ toolchain is installed on the host any more.
+- The Linux installer no longer reports success when another process holds port
+ 8123. Its readiness check required only that something answered, which a
+ foreign listener satisfies; it now also requires the unit to be active, and
+ refuses to start when the port is already taken.
+- A version mismatch between installer and archive failed silently after
+ several minutes of work. It now names both versions and states that nothing
+ was installed.
+- The website no longer requires a Windows Setup executable, `.nupkg` and
+ `RELEASES` to exist before it will serve release metadata. That requirement
+ backed the endpoint the Linux installer resolves, so the first release
+ without those files would have broken the public Linux and Windows
+ installers simultaneously.
+
## [0.0.38] - 2026-08-02
### Fixed
@@ -1038,6 +1099,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
Application Support, and isolated Apple container machines.
[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.36...HEAD
+[0.0.39]: https://github.com/gitcommit90/1Helm/compare/v0.0.30...v0.0.39
[0.0.38]: https://github.com/gitcommit90/1Helm/compare/v0.0.30...v0.0.38
[0.0.37]: https://github.com/gitcommit90/1Helm/compare/v0.0.30...v0.0.37
[0.0.36]: https://github.com/gitcommit90/1Helm/compare/v0.0.35...v0.0.36
diff --git a/README.md b/README.md
index b91ceb6..1b1cd7e 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@
Download for Mac
·
- for Windows
+ for Windows
·
for Linux
·
@@ -130,30 +130,74 @@ device displaying the web UI—to download and verify the signed update.
### Windows 11 x64
-1. [Download the current Setup executable](https://1helm.com/download/windows).
-2. Windows Setup is **not yet Authenticode signed**, so SmartScreen shows
- "Windows protected your PC". Choose **More info** → **Run anyway**.
-3. Open 1Helm and complete Captain → Providers → Workspace.
-4. At the Workspace step, 1Helm builds its WSL 2 runtime. **You do not need WSL
- installed beforehand.** A stock Windows 11 ships with WSL and
- VirtualMachinePlatform turned off, and 1Helm enables both itself:
- - Approve the one administrator (UAC) prompt.
- - A PowerShell window opens and reports progress. **Leave it open** until it
- finishes.
- - Because those Windows features were just turned on, **Windows has to
- restart once.** 1Helm says so in plain language. This is the normal path
- on a new PC — it is not an error, and nothing is lost.
- - Restart, sign back in as the **same** Windows user, then open 1Helm and
- continue setup. It picks up where it left off; already-completed steps are
- skipped.
-
-Setup downloads Microsoft's pinned WSL 2 package and a pinned Ubuntu 24.04 root
-filesystem, both SHA-256 verified, and the WSL package is additionally checked
-for a valid Microsoft Authenticode signature. The result is one
-installation-scoped WSL 2 runtime hosting one durable OCI container per ordinary
-channel, with Windows-drive mounts and process interop disabled. App state lives
-in `%APPDATA%\1Helm-OCI-v1`; the shared runtime disk lives in
-`%LOCALAPPDATA%\1Helm-Runtime`.
+There is nothing to download and no Windows application to install. 1Helm runs
+its ordinary **Linux** build inside a WSL 2 distribution named `1helm`, and your
+**browser is the interface**, at `http://localhost:8123`. Because no `.exe`
+ships, nothing needs code signing and **SmartScreen never appears**.
+
+You need: Windows 11 **x64** (arm64 is not supported), virtualization enabled in
+firmware, internet access, and roughly 10 GB of free disk. **You do not need to
+install WSL first** — this does it for you.
+
+1. Open **PowerShell**. The normal one — do **not** use "Run as
+ Administrator".
+
+2. Run exactly this:
+
+ ```powershell
+ irm https://1helm.com/install.ps1 | iex
+ ```
+
+3. A Windows permission pop-up appears. Click **Yes**. That one approval covers
+ only turning on Windows' WSL features and installing Microsoft's own WSL
+ package; everything after it deliberately runs as you, because WSL state
+ belongs to the signed-in user.
+
+4. Wait about a minute. The window finishes by printing **"Restart required"**
+ and a short numbered list. **This is normal — it is not an error and nothing
+ is lost.**
+
+5. Restart the PC.
+
+6. Sign back in as the **same** Windows user and open PowerShell again.
+
+7. Run the **identical command** a second time:
+
+ ```powershell
+ irm https://1helm.com/install.ps1 | iex
+ ```
+
+8. Wait about six and a half minutes. Pages of `apt` output scroll past — that
+ is normal progress. When it is done it prints the address and opens your
+ default browser on the onboarding page.
+
+9. Complete Captain → Providers → Workspace in the browser.
+
+The whole thing takes about **9 minutes**, restart included.
+
+Two things you may see along the way:
+
+- Microsoft's own **"Welcome to WSL"** window may open during step 8. It belongs
+ to Microsoft, it is harmless, and you can close it.
+- After 1Helm reports that it is running, the channel-computer runtime needs
+ roughly another **40 seconds** to finish preparing before your first channel
+ computer can be created. It has not hung.
+
+If you *download* `install.ps1` instead of piping it, Windows blocks running
+`.ps1` files and you must run it as
+`powershell -NoProfile -ExecutionPolicy Bypass -File .\install.ps1`. The
+`irm | iex` form above is unaffected, because it pipes a string rather than
+executing a file.
+
+One behaviour difference from earlier versions: **`#main`'s Terminal is now bash
+inside the WSL distribution, not `cmd.exe`.** Windows commands do not work
+there. That is deliberate — the host is Linux now.
+
+To remove it later, from the same ordinary PowerShell window:
+
+```powershell
+irm https://1helm.com/uninstall.ps1 | iex
+```
### Linux (Ubuntu/Debian, systemd)
@@ -178,20 +222,26 @@ machines for safe deletion. Export irreplaceable channel files before you start.
- **macOS** — drag 1Helm to the Trash. `~/Library/Application Support/1Helm-OCI-v1`
is preserved unless you delete it yourself.
-- **Windows** — uninstall from Settings → Apps → Installed apps. The uninstaller
- removes 1Helm's own containers, unregisters its WSL runtime, and deletes
- `%LOCALAPPDATA%\1Helm-Runtime`.
+- **Windows** — from an ordinary PowerShell window, run
+ `irm https://1helm.com/uninstall.ps1 | iex`. It stops the keepalive, runs
+ 1Helm's own Linux uninstaller inside the distribution, then unregisters the
+ `1helm` distribution and deletes `C:\1helm` and the Start Menu shortcut. It
+ asks you to type `remove` first, because unregistering the distribution
+ **destroys every channel's files and the database** — there is no undo and no
+ copy is kept. Other WSL distributions on the PC are never touched.
- **Linux** — `sudo /opt/1helm/uninstall-host.sh` removes the services, helper,
and 1Helm-owned containers while preserving `/var/lib/1helm-oci-v1` for
recovery.
### Release discipline
-Mac, Linux, and Windows use one synchronized desktop release version. A release
-is held in full until the signed/notarized Mac DMG and updater ZIP, verified
-Linux host archive, and Windows Setup/Squirrel feed have all passed native
-install and update acceptance from the same source commit. Windows
-Authenticode status is disclosed in every release; v0.0.38 is `NotSigned`.
+Mac and Linux use one synchronized desktop release version, and a release is
+held in full until all three artifacts — the signed/notarized Mac DMG, the
+notarized Mac updater ZIP, and the verified Linux host archive — have passed
+native install and update acceptance from the same source commit. Windows ships
+no release artifacts at all: it installs the Linux build through
+`install.ps1`, served from the site, so there is nothing to sign and no
+Authenticode status to disclose.
### Connect from a phone or tablet
@@ -324,9 +374,9 @@ and an audit trail. A prompt saying “use this service” is not a connector.
SHA-256 chain for new operational events.
- Local-first collaboration through an optional workspace domain routed to the
Captain's helm host; workspace state and provider credentials remain there.
-- Host-owned updates: a signed native Mac updater, a Windows Squirrel feed with
- disclosed Authenticode status, and an atomic digest-verified Linux system
- service with health-check rollback.
+- Host-owned updates: a signed native Mac updater, and an atomic digest-verified
+ Linux system service with health-check rollback — which is also how a Windows
+ host updates, because Windows runs that same Linux service inside WSL.
- Signed, Apple-notarized, stapled Apple Silicon DMG releases.
- Browser access from phones and tablets to an already configured HTTPS 1Helm
host; native mobile gateway source is present but has no v0.0.38 public build.
@@ -337,7 +387,7 @@ and an audit trail. A prompt saying “use this service” is not a connector.
|---|---|
| **Apple Silicon macOS 26** | Native desktop product and real isolated Linux computer per resident (Apple `container machine`, `home-mount=none`). |
| **Linux / CI** | Supported headless systemd host with one durable Podman OCI container per resident, runtime-owned storage, and exact ownership checks; CI may select an explicit test backend. |
-| **Windows 11 x64** | Native desktop product with one installation-scoped WSL 2 OCI runtime and one durable container per resident; Windows-drive mounts and interop are disabled. |
+| **Windows 11 x64** | The Linux host, installed by `install.ps1` into a WSL 2 distribution named `1helm`, with the browser as the interface at `http://localhost:8123`. One durable Podman OCI container per resident, exactly as on Linux. No Windows application ships. |
| **iPhone, iPad, and Android** | Use the current HTTPS browser interface. Native gateway source exists, but v0.0.38 has no public mobile artifact and the iOS app is not publicly listed. |
Not yet shipped: current public mobile builds, a native Linux desktop shell, a
@@ -365,7 +415,7 @@ A fresh data directory opens first-run setup. The source runtime defaults to
| `PORT` | `8123` | HTTP/WebSocket control-plane port. |
| `CTRL_DATA_DIR` | `./data` | Databases, routing state, uploads, and non-OCI development/Apple workspace mirrors. |
| `HELM_CHANNEL_COMPUTER_BACKEND` | `apple` on macOS, `oci` on Linux and Windows | Host isolation backend; `native` and `mock` are explicit development/test overrides. |
-| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.38` | Versioned channel-machine image contract. |
+| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.39` | Versioned channel-machine image contract. |
### Agent-first JSON CLI
@@ -383,9 +433,10 @@ npm run helm -- audit-verify
## Architecture
-1Helm is a compact Node/TypeScript control plane hosted by Electron on macOS
-and in the accepted Windows implementation, or by systemd on Linux. It does not
-need an external database or a server transpilation step.
+1Helm is a compact Node/TypeScript control plane hosted by Electron on macOS, or
+by systemd on Linux — including the Linux inside a Windows host's WSL 2
+distribution. It does not need an external database or a server transpilation
+step.
| Layer | Implementation |
|---|---|
@@ -393,7 +444,7 @@ need an external database or a server transpilation step.
| Control plane | `node:http`, WebSocket, additive SQLite migrations. |
| Client | Vanilla TypeScript bundled with esbuild and Tailwind CSS. |
| Model routing | Embedded ReRouted headless engine, private internal gateway, account pools, retries, routes, quotas, and logs. |
-| Computers | Defensive argv-only Apple `container machine`; native Podman OCI on Linux; one shared managed WSL 2/Podman runtime on Windows; explicit `native`/`mock` test seams. |
+| Computers | Defensive argv-only Apple `container machine`; native Podman OCI on Linux, including inside a Windows host's WSL 2 distribution; explicit `native`/`mock` test seams. |
| Terminal | `node-pty`; ordinary terminals enter their channel VM while Skipper remains native. |
| Memory | Curated records with provenance plus an isolated Mnemosyne SQLite store per identity. |
| Scheduling | Durable obligations, wake reconciliation, lifecycle safety, repair, update, and pressure-aware sizing. |
@@ -430,9 +481,9 @@ the complete `npm test` contract.
## Security boundary
-- Residents use separate Linux worlds: Apple machines with no Mac home mount,
- or durable OCI containers on Linux and inside Windows' one shared managed
- WSL runtime. Windows-drive mounts and interop are disabled.
+- Residents use separate Linux worlds: Apple machines with no Mac home mount, or
+ durable OCI containers on Linux — including the Linux inside a Windows host's
+ WSL 2 distribution.
- Skipper's host tools require Captain-authorized provenance.
- OCI workspace storage is runtime-owned and authoritative; Files and Cowork
access it directly through a channel-scoped boundary. Apple mirrors remain
diff --git a/desktop/main.cjs b/desktop/main.cjs
index 62a5618..567ca7c 100644
--- a/desktop/main.cjs
+++ b/desktop/main.cjs
@@ -41,34 +41,14 @@ function rememberDesktopMode(mode) {
fs.writeFileSync(desktopModePath(), `${mode}\n`, { mode: 0o600 });
}
-// Windows packages ship application code inside app.asar; assets consumed by
-// external processes (Python, PowerShell, WSL, plain-Node sidecars) are
-// unpacked beside the archive. Translate paths for those consumers. Loose
-// packages (macOS, Linux, development) pass through unchanged.
+// An asar-packaged build keeps application code inside app.asar while assets
+// consumed by external processes (Python, plain-Node sidecars) are unpacked
+// beside the archive. Translate paths for those consumers. Loose packages
+// (macOS, Linux, development) pass through unchanged.
function unpackedPath(target) {
return String(target).replace(/app\.asar(?=[\\/]|$)/, "app.asar.unpacked");
}
-function handleSquirrelEvent() {
- if (process.platform !== "win32") return false;
- const event = process.argv[1];
- if (!["--squirrel-install", "--squirrel-updated", "--squirrel-uninstall", "--squirrel-obsolete"].includes(event)) return false;
- const appFolder = path.resolve(process.execPath, "..");
- const updateExe = path.resolve(appFolder, "..", "Update.exe");
- const exe = path.basename(process.execPath);
- if (event === "--squirrel-install" || event === "--squirrel-updated") {
- spawnSync(updateExe, ["--createShortcut", exe], { stdio: "ignore", windowsHide: true });
- } else if (event === "--squirrel-uninstall") {
- const dataRoot = app.getPath("userData");
- const wslRoot = path.join(String(process.env.LOCALAPPDATA || ""), "1Helm-Runtime");
- const cleanup = unpackedPath(path.resolve(__dirname, "..", "scripts", "windows-removal.cjs"));
- spawnSync(process.execPath, [cleanup, dataRoot, wslRoot], { env: { ...process.env, ELECTRON_RUN_AS_NODE: "1" }, stdio: "ignore", windowsHide: true, timeout: 10 * 60_000 });
- spawnSync(updateExe, ["--removeShortcut", exe], { stdio: "ignore", windowsHide: true });
- }
- setTimeout(() => app.quit(), 1000);
- return true;
-}
-
function preferredWorkspaceOrigin() {
if (desktopMode() !== "client") return localOrigin;
try {
@@ -310,10 +290,7 @@ function createWindow(showWhenReady = true) {
mainWindow = window;
}
-if (handleSquirrelEvent()) {
- // Squirrel install/update/uninstall work must exit before the application
- // acquires its normal single-instance lock or starts the local server.
-} else if (!app.requestSingleInstanceLock()) {
+if (!app.requestSingleInstanceLock()) {
app.quit();
} else {
app.on("second-instance", (_event, argv) => {
@@ -325,7 +302,6 @@ if (handleSquirrelEvent()) {
});
app.whenReady().then(async () => {
- if (process.platform === "win32") app.setAppUserModelId("com.squirrel.1Helm.1Helm");
session.defaultSession.setPermissionCheckHandler((webContents, permission, _origin, details) => microphonePermissionAllowed(webContents, permission, details));
session.defaultSession.setPermissionRequestHandler(async (webContents, permission, callback, details) => {
if (!microphonePermissionAllowed(webContents, permission, details)) { callback(false); return; }
diff --git a/desktop/updater.cjs b/desktop/updater.cjs
index 9e2ba29..d61aa52 100644
--- a/desktop/updater.cjs
+++ b/desktop/updater.cjs
@@ -21,23 +21,25 @@ function createNativeUpdateService({ app, autoUpdater, platform = process.platfo
let busy = false;
let initialTimer = null;
let intervalTimer = null;
- const nativeMode = platform === "win32" ? "native-windows" : "native-macos";
+ // Only macOS has a native 1Helm host. A Windows host is the Linux host inside
+ // WSL 2, so it updates through the in-distribution Linux systemd updater and
+ // never through this Electron feed.
let state = {
- mode: nativeMode,
+ mode: "native-macos",
status: "idle",
current_version: app.getVersion(),
version: null,
checked_at: null,
error: null,
- message: `Check for a signed 1Helm update on this ${platform === "win32" ? "Windows PC" : "Mac"}.`,
+ message: "Check for a signed 1Helm update on this Mac.",
};
let inApplications = true;
if (platform === "darwin" && typeof app.isInApplicationsFolder === "function") {
try { inApplications = app.isInApplicationsFolder(); } catch { inApplications = false; }
}
- const feedPlatform = platform === "win32" && arch === "x64" ? "win32-x64" : "darwin-arm64";
- const supported = app.isPackaged === true && ((platform === "darwin" && arch === "arm64" && inApplications) || (platform === "win32" && arch === "x64"));
+ const feedPlatform = "darwin-arm64";
+ const supported = app.isPackaged === true && platform === "darwin" && arch === "arm64" && inApplications;
const feedUrl = `https://update.electronjs.org/gitcommit90/1Helm/${feedPlatform}/${encodeURIComponent(app.getVersion())}`;
const snapshot = () => ({ ...state });
@@ -53,7 +55,7 @@ function createNativeUpdateService({ app, autoUpdater, platform = process.platfo
? "Move 1Helm to Applications to enable host updates."
: null,
message: app.isPackaged
- ? "Signed automatic updates are available for supported macOS and Windows hosts."
+ ? "Signed automatic updates are available for supported macOS hosts."
: "Development builds are updated from their source checkout.",
});
return false;
@@ -122,7 +124,7 @@ function createNativeUpdateService({ app, autoUpdater, platform = process.platfo
if (state.status !== "ready") {
return { ...snapshot(), error: "No downloaded host update is ready." };
}
- setState({ status: "installing", error: null, message: `1Helm is restarting this ${platform === "win32" ? "Windows" : "Mac"} host to install the verified update…` });
+ setState({ status: "installing", error: null, message: "1Helm is restarting this Mac host to install the verified update…" });
process.env.HELM_UPDATE_INSTALLING = "1";
return snapshot();
}
diff --git a/docs/GOVERNANCE.md b/docs/GOVERNANCE.md
index 35cd5eb..80972b2 100644
--- a/docs/GOVERNANCE.md
+++ b/docs/GOVERNANCE.md
@@ -57,23 +57,31 @@ contract as the slice hardens.
8. A multi-item user request retains a numbered acceptance ledger in the pull
request and GitHub Release. Do not collapse completed items into a generic
summary or rely on generated commit notes as the user-facing release record.
-9. Each supported desktop platform owns its native artifact and installed-app
- verification lane. The retained Apple Silicon host owns macOS signing and
- notarization; Linux owns the systemd/OCI artifact and updater acceptance;
- Windows 11 x64 owns Squirrel and shared-WSL OCI acceptance. Authenticode is optional
- until 1Helm adopts a trusted Windows signing identity; unsigned artifacts
- must be identified honestly, but their signature status is not a release
- blocker.
+9. Each supported desktop platform owns an installed-app verification lane. The
+ retained Apple Silicon host owns macOS signing, notarization, and its two
+ artifacts; Linux owns the systemd/OCI artifact and updater acceptance.
+ **Windows owns no artifact**: it runs the Linux host inside a per-user WSL 2
+ distribution installed from `https://1helm.com/install.ps1`, so Windows 11
+ x64 owns a behavioural acceptance lane instead — non-elevated one-liner
+ install with a single UAC prompt, restart and resume, keepalive across a
+ reboot, `http://localhost:8123` onboarding, prior-version update with the
+ data root retained, and removal via `uninstall.ps1`. Because no Windows
+ executable code ships, there is no signing identity or signature status to
+ record or disclose for it.
## Versioning
- Semantic versioning on `package.json`.
- **Do not** reuse a published version tag for different bits.
-- A desktop release requires one unique version and exact commit, changelog,
- complete Mac + Linux + Windows artifact matrix, and clean-install plus
- prior-to-new update evidence on every platform. Partial platform releases
- under the shared product version are prohibited. If one platform is blocked,
- the entire tag/publication waits.
+- A desktop release requires one unique version and exact commit, changelog, the
+ complete three-artifact matrix (`1Helm--arm64.dmg`,
+ `1Helm--mac-arm64.zip`, `1Helm--linux-node.tgz`), and
+ clean-install plus prior-to-new update evidence on macOS, Linux, and Windows.
+ Windows publishes no artifact; its installer is served by the site, not
+ attached to the release. Partial platform releases under the shared product
+ version are prohibited. If one platform is blocked, the entire
+ tag/publication waits. Because a Windows host installs the Linux archive, a
+ blocked Linux artifact blocks Windows too.
- GitHub Release notes are a first-class product artifact. They must enumerate
every user-visible fix and feature accepted for that release, using the same
numbered ledger as the originating request when one exists. A short summary
@@ -84,14 +92,20 @@ contract as the slice hardens.
- Linux verification must use the digest-qualified release archive and prove a
real systemd update, health-failure rollback, and retained
`/var/lib/1helm-oci-v1`.
-- Windows verification must prove the Setup/Squirrel signature status, clean
- install, old-to-new update, loopback health, WSL lifecycle, and retained
- application data on Windows 11 x64. Clean install must be exercised on a host
- where WSL and VirtualMachinePlatform start disabled, covering the elevation
- prompt, the required Windows restart, and resumed setup after that restart.
- Do not substitute a self-signed
- certificate or block an otherwise accepted release solely because the
- artifacts are honestly disclosed as unsigned.
+- Windows verification is behavioural and must be performed on real Windows 11
+ x64 hardware. It must prove: a clean install driven by
+ `irm https://1helm.com/install.ps1 | iex` from an ordinary, non-elevated
+ PowerShell window with exactly one UAC prompt, exercised on a host where
+ `Microsoft-Windows-Subsystem-Linux` and `VirtualMachinePlatform` start
+ disabled; the mid-install restart reported without a false failure and the
+ identical command resuming to completion as the same signed-in user; the
+ keepalive registered as that user's scheduled task and surviving a reboot with
+ `1helm.service` active; a browser on that PC reaching `http://localhost:8123`
+ and completing onboarding; a prior-version update through the in-distribution
+ Linux updater with the data root under `/var/lib/1helm-oci-v1` retained; and
+ removal via the site-served `uninstall.ps1`, which must never call
+ `wsl --shutdown` and must never unregister a distribution whose name is not an
+ exact match for the target. No Windows signature status exists to record.
Never hand-edit only a deployment target to fix the product. Fix in git,
review, merge, and redeploy the exact source commit.
diff --git a/docs/USER_GUIDE.md b/docs/USER_GUIDE.md
index f5cd638..b39a685 100644
--- a/docs/USER_GUIDE.md
+++ b/docs/USER_GUIDE.md
@@ -165,9 +165,15 @@ longer exists, 1Helm opens a fresh one.
Ordinary residents cannot select or enter the Captain's native host. On
supported Apple Silicon Macs, each resident runs inside its own Apple
`container machine` with `home-mount=none`; Linux systemd hosts use one durable
-Podman OCI container per resident; Windows uses one installation-scoped WSL 2
-runtime hosting one container per resident, with Windows-drive mounts and
-interop disabled. `native` and `mock` remain explicit source/CI test seams.
+Podman OCI container per resident. A Windows host is that same Linux host,
+running inside a WSL 2 distribution named `1helm`, so its residents get the
+identical Podman OCI containers. `native` and `mock` remain explicit source/CI
+test seams.
+
+On Windows, `#main`'s Terminal is therefore **bash inside that WSL
+distribution, not `cmd.exe`** — Windows commands do not work there. This is a
+deliberate change from earlier versions, where the Windows host was a native
+application and Skipper's terminal was the Windows shell.

@@ -385,21 +391,36 @@ Every host update preserves:
```text
macOS: ~/Library/Application Support/1Helm-OCI-v1
Linux: /var/lib/1helm-oci-v1
-Windows: %APPDATA%\1Helm-OCI-v1 (plus %LOCALAPPDATA%\1Helm-Runtime)
+Windows: /var/lib/1helm-oci-v1, inside the "1helm" WSL 2 distribution
```
On macOS that directory contains databases, credentials, workspaces, resident
-state, and Apple mirrors. Linux and Windows preserve the equivalent
-OCI-generation state; on Windows the shared WSL runtime disk lives separately
-under `%LOCALAPPDATA%\1Helm-Runtime`. The retired data roots remain untouched
-and are not imported by this generation. Do not delete a current data root
-during replacement.
+state, and Apple mirrors. Linux preserves the equivalent OCI-generation state.
+A Windows host has **no data under `%APPDATA%`**: it runs the Linux host inside
+WSL, so the same `/var/lib/1helm-oci-v1` is the data root and it lives on that
+distribution's virtual disk under `C:\1helm\distro`. Reach it from PowerShell
+with `wsl -d 1helm -u root --exec ls /var/lib/1helm-oci-v1`; it is root-owned
+inside the distribution, exactly as on any other Linux host. The
+retired data roots remain untouched and are not imported by this generation. Do
+not delete a current data root during replacement, and do not unregister the
+`1helm` distribution unless you intend to destroy everything on it.
Before removing 1Helm, use its removal preparation flow. It is Captain-only,
requires typed confirmation, reports backend-owned resident machines, and
prepares those machines for safe deletion. Export or back up irreplaceable
channel files first.
+Then, per host: on macOS drag the app to the Trash; on Linux run
+`sudo /opt/1helm/uninstall-host.sh`; on Windows run
+`irm https://1helm.com/uninstall.ps1 | iex` from an ordinary PowerShell window,
+signed in as the user who installed it. macOS and Linux deliberately leave the
+data root in place for recovery. **Windows does not**, and cannot: it unregisters
+the `1helm` distribution, which deletes the virtual disk the entire data root
+lives on. It therefore asks you to type `remove` before it starts, states exactly
+what will be lost, and takes `-Force` only for scripted removal. Other WSL
+distributions on the PC are never touched, and Windows' own WSL feature is left
+installed.
+
Recovery principles:
- restore an archived channel rather than recreating it;
@@ -414,29 +435,40 @@ Recovery principles:
### First run and installation
-**Windows asks me to restart in the middle of setup.** That is the expected
-path on a normal Windows 11 PC. WSL and VirtualMachinePlatform ship disabled;
-1Helm turns them on for you, and Windows cannot use them until it restarts.
-Restart, sign back in as the same Windows user, open 1Helm, and continue —
-completed steps are skipped. Nothing is lost and nothing else is required.
-
-**Windows says "Windows protected your PC" when I run Setup.** Windows Setup is
-not yet Authenticode signed, so SmartScreen warns about it. Choose **More info**
-→ **Run anyway**. Every release discloses its Authenticode status; v0.0.38 is
-`NotSigned`. Only run an installer you downloaded from
-[1helm.com](https://1helm.com/download/windows) or the project's GitHub
-releases.
-
-**A PowerShell window opened during Windows setup.** That window is the setup
-itself and shows live progress. Leave it open until it finishes; closing it
-early aborts the step. 1Helm mirrors the same progress in the app and writes a
-log to `%APPDATA%\1Helm-OCI-v1\windows-wsl-setup.log`.
-
-**Windows setup failed or stalled.** Check the PowerShell window for the error,
-then use **Retry shared runtime setup** in onboarding or Settings → Channel
-computers. Setup is idempotent — retrying resumes rather than starting over.
-The runtime requires Windows 11 **x64**; arm64 Windows is not supported by this
-build.
+**Windows printed "Restart required" and stopped.** That is the expected halfway
+point of a Windows install, not a failure. WSL and VirtualMachinePlatform ship
+disabled; the installer turns them on for you, and Windows cannot use them until
+it restarts. Restart, sign back in as the same Windows user, open PowerShell, and
+run the **same command again** — it continues from where it stopped and skips
+what is already done. Nothing is lost. The whole install, restart included, took
+about 8 minutes 49 seconds on a real Windows 11 machine.
+
+**Windows refuses to run install.ps1.** You downloaded the script instead of
+piping it, and Windows blocks running `.ps1` files. Use
+`powershell -NoProfile -ExecutionPolicy Bypass -File .\install.ps1`. The
+`irm https://1helm.com/install.ps1 | iex` one-liner is unaffected, because it
+pipes a string into PowerShell rather than executing a file.
+
+**A "Welcome to WSL" window opened during the Windows install.** That window is
+Microsoft's, not 1Helm's. It is harmless; close it and let the install continue.
+
+**Windows says nothing is listening on `http://localhost:8123`.** After the
+installer reports 1Helm is running, the channel-computer runtime needs roughly
+another 40 seconds to finish preparing before the first channel computer can be
+created — it has not hung. If the address itself stays unavailable, ask the
+service inside the distribution:
+`wsl -d 1helm -u root --exec systemctl status 1helm`.
+
+**Windows says port 8123 is already in use.** Windows and every WSL distribution
+share one network namespace, so another distribution or an ordinary Windows
+process listening on 8123 stops 1Helm binding it. The installer refuses to
+continue rather than half-install, and names the port. Stop whatever owns it and
+run the command again.
+
+**The Windows install stopped for another reason.** Every step is idempotent:
+read the reason it printed, fix it, and run the same command again — it resumes
+rather than starting over. It requires Windows 11 **x64**; arm64 Windows is not
+supported by this build.
**macOS blocks the app or reports it is damaged.** The Mac release is Developer
ID signed, notarized, and stapled, so Gatekeeper should accept it after you
@@ -484,8 +516,8 @@ fallback.
## Security summary
- Per-resident Apple Linux VMs have no Mac home mount. OCI residents use exact
- container labels and runtime-owned storage; the shared Windows runtime
- disables Windows-drive mounts and interop.
+ container labels and runtime-owned storage, including inside a Windows host's
+ WSL 2 distribution.
- Credentials and connectors remain host-owned and minimally brokered.
- Membership scopes data and live events; private coworker channels are not
Captain-readable without invitation.
@@ -494,8 +526,10 @@ fallback.
- External skills are revision-pinned, bounded, scanned, hashed, and wrapped.
- Operational history is locally tamper-evident.
- Mac artifacts are Developer ID signed, notarized, stapled, and Gatekeeper
- verified. Linux assets are digest-verified, and Windows Authenticode status
- is disclosed for every release (`NotSigned` for v0.0.38).
+ verified, and Linux assets are digest-verified. Windows ships no artifact of
+ its own; its installer verifies Microsoft's WSL package against a pinned
+ SHA-256 and a valid Microsoft Authenticode signature, and the pinned Ubuntu
+ root filesystem against its SHA-256.
For the detailed boundary, see [SECURITY.md](../SECURITY.md). For product intent,
see [VISION.md](VISION.md).
diff --git a/docs/release-checklist.md b/docs/release-checklist.md
index f31a2d4..a3bcc57 100644
--- a/docs/release-checklist.md
+++ b/docs/release-checklist.md
@@ -12,6 +12,18 @@ Do not create the tag or GitHub Release, publish any platform, mark anything
latest, or say “done” until all three lanes pass. If one lane is blocked, pause
the whole release and report it.
+**Three release artifacts, not six.** A complete release attaches exactly
+`1Helm--arm64.dmg`, `1Helm--mac-arm64.zip` and
+`1Helm--linux-node.tgz`. **Windows publishes nothing.** There is no
+Windows executable, no Windows installer package, no Windows update manifest, no
+Electron host on Windows and nothing to code-sign, so no signing status exists to
+record or disclose. A Windows host is the Linux host running inside a per-user WSL 2
+distribution named `1helm`, installed from `https://1helm.com/install.ps1`,
+which the site serves rather than a GitHub Release. Windows is therefore
+accepted by behaviour (Section 7) rather than by artifact, and because a Windows
+host installs the Linux archive, a Linux artifact that has not passed acceptance
+blocks Windows too.
+
## 1. Prepare
```bash
@@ -73,18 +85,16 @@ VERSION="$(node -p "require('./package.json').version")"
HEADLESS="dist/1Helm-${VERSION}-linux-node.tgz"
DMG="dist/1Helm-${VERSION}-arm64.dmg"
UPDATE_ZIP="dist/1Helm-${VERSION}-mac-arm64.zip"
-WINDOWS_SETUP="dist/1Helm-${VERSION}-windows-x64-setup.exe"
-WINDOWS_NUPKG="dist/1Helm-${VERSION}-full.nupkg"
-WINDOWS_RELEASES="dist/RELEASES"
ANDROID_APK="dist/1Helm-${VERSION}-universal.apk"
RELEASE_NOTES="dist/1Helm-${VERSION}-release-notes.md"
# Build from clean snapshots of the same MERGED_COMMIT on the platform owners:
# macOS arm64: npm ci && npm run typecheck && npm run build && npm test && npm run package:dmg:release
# Linux: npm ci && npm run typecheck && npm run build && npm test && npm run package:linux
-# Windows x64: npm ci && npm run typecheck && npm run build && npm test && npm run package:windows
+# Windows: no build. A Windows host installs "$HEADLESS" through the
+# site-served install.ps1; there is no Windows artifact to produce.
-for artifact in "$DMG" "$UPDATE_ZIP" "$HEADLESS" "$WINDOWS_SETUP" "$WINDOWS_NUPKG" "$WINDOWS_RELEASES"; do
+for artifact in "$DMG" "$UPDATE_ZIP" "$HEADLESS"; do
test -s "$artifact"
done
# Author RELEASE_NOTES from docs/release-notes-template.md. It must contain the
@@ -94,12 +104,13 @@ test -s "$RELEASE_NOTES"
rg -q '^1\. ' "$RELEASE_NOTES" # multi-item ships must retain a numbered ledger
```
-The Windows `.nupkg` basename must exactly match the entry inside `RELEASES`.
-Record Authenticode status for Windows executable code and Setup. Trusted
-signing is optional until 1Helm adopts a Windows signing identity: an honestly
-disclosed `NotSigned` result is accepted and must not block the release. Never
-substitute a self-signed identity. When a trusted identity is configured, use
-the fail-closed `package:windows:release` command.
+Those three files are the whole desktop matrix. Do not invent a fourth desktop
+asset, and do not attach `install.ps1`, `uninstall.ps1` or the keepalive payload
+to the release: they are served from the site, so a release commit that changes
+them is not shipped until the site is deployed. Because Windows ships no
+executable code of its own, there is no Windows signing identity and no Windows
+signature status to record or disclose. Never sign anything with a self-signed
+identity.
Only after Sections 6–8 pass for all three desktop platforms:
@@ -108,7 +119,6 @@ git tag -a "v${VERSION}" "$MERGED_COMMIT" -m "1Helm ${VERSION}"
git push origin "refs/tags/v${VERSION}"
gh release create "v${VERSION}" \
"$DMG" "$UPDATE_ZIP" "$HEADLESS" \
- "$WINDOWS_SETUP" "$WINDOWS_NUPKG" "$WINDOWS_RELEASES" \
--title "1Helm ${VERSION}" --notes-file "$RELEASE_NOTES" --draft
# Upload mobile artifacts through their applicable distribution lane; their
# timing never permits a partial desktop release.
@@ -166,16 +176,39 @@ Expect first-run / needs_setup on empty data dir.
host running the prior release, invoke the Captain host-update action,
observe checking/downloading/installing/restarting, verify the new version
and `/var/lib/1helm-oci-v1` identity, and exercise health-failure rollback.
-- **Windows:** on Windows 11 x64, record Authenticode status for Setup, the
- packaged app, and its executable code; confirm `.nupkg` and `RELEASES`
- consistency; clean install Setup; exercise the real shared-WSL OCI channel lifecycle;
- then expose staged
- Squirrel metadata to the prior public version and prove download,
- verification, restart installation, new version, loopback health, shared
- runtime state, and current-generation app-data preservation.
+- **Windows:** accepted by behaviour on real Windows 11 x64 hardware, not by
+ artifact. There is nothing to sign and no update feed to stage. Prove every
+ one of these:
+ 1. **Clean install from the one-liner.** In an ordinary, **non-elevated**
+ PowerShell window, run `irm https://1helm.com/install.ps1 | iex`. Exactly
+ **one** UAC prompt appears, and only the Windows optional features
+ (`Microsoft-Windows-Subsystem-Linux`, `VirtualMachinePlatform`) and
+ Microsoft's own WSL package run elevated. Everything else — importing the
+ distribution, installing 1Helm inside it, registering the keepalive — runs
+ as the signed-in user, because WSL state is per-user.
+ 2. **Restart and resume.** The first run reports the required restart and
+ exits without a false failure. After the restart, re-running the identical
+ command as the **same** signed-in Windows user resumes and completes.
+ 3. **Keepalive survives a reboot.** The keepalive is registered as that user's
+ scheduled task, starts again at sign-in after a reboot, and holds the
+ distribution up with `1helm.service` active.
+ 4. **Browser reaches the host.** A browser on that PC reaches
+ `http://localhost:8123` and completes onboarding.
+ 5. **Prior-version update preserves the data root.** Update from the previous
+ release through the in-distribution Linux updater and confirm the new
+ version, loopback health, and a retained data root under
+ `/var/lib/1helm-oci-v1`.
+ 6. **Removal.** `irm https://1helm.com/uninstall.ps1 | iex` removes the
+ keepalive, the `1helm` distribution and `C:\1helm`. It must never call
+ `wsl --shutdown` and must never unregister a distribution whose name is not
+ an exact match for the target; other distributions on the PC are untouched.
- Before publication, compare each uploaded GitHub asset digest with the local
- verified digest and assert the release contains the complete six-file
- desktop matrix. A missing asset is a release blocker, not “not applicable.”
+ verified digest and assert the release contains the complete **three-file**
+ desktop matrix: `1Helm--arm64.dmg`,
+ `1Helm--mac-arm64.zip`, `1Helm--linux-node.tgz`. A missing
+ asset is a release blocker, not “not applicable.” Windows contributes no
+ asset, so an absent Windows file is correct — an absent Windows **behavioural
+ record** is a blocker.
## 8. Clean deployment verify (when shipping install path)
@@ -196,8 +229,11 @@ Local setup: needs_setup verified on clean CTRL_DATA_DIR
Clean deploy:
Mac host update:
Linux update:
-Windows update:
-Desktop matrix:
+Windows:
+Desktop matrix:
Android:
iOS:
CI: Actions green on main
diff --git a/docs/release-lifecycle.md b/docs/release-lifecycle.md
index 3240499..1aa9ec7 100644
--- a/docs/release-lifecycle.md
+++ b/docs/release-lifecycle.md
@@ -5,20 +5,34 @@ Process contract from intent to verified deploy. Commands: [release-checklist.md
## Immutable desktop release rule
1Helm has one synchronized desktop-host release train. A named desktop release
-is one version, one exact source commit, and one GitHub Release containing all
-of the following:
-
-- Apple Silicon macOS DMG and native updater ZIP;
-- Linux host archive;
-- Windows x64 Setup executable, full Squirrel package, and `RELEASES` manifest.
-
-All three platform lanes are mandatory even when a change appears
-platform-specific, because the application source and updater version advance
-together. Do not tag, create or publish a GitHub Release, mark it latest, or
-update public download/feed metadata until every lane is built, signed where
-required, digest-verified, installed, and update-tested from the previous
-release. If any lane is unavailable or fails, pause the whole release. Never
-publish a Mac-only or otherwise partial set under the product version.
+is one version, one exact source commit, and one GitHub Release containing
+exactly these **three** artifacts:
+
+- `1Helm--arm64.dmg` — Developer ID signed, Apple-notarized and stapled
+ Apple Silicon macOS DMG;
+- `1Helm--mac-arm64.zip` — the notarized/stapled native updater ZIP;
+- `1Helm--linux-node.tgz` — the digest-qualified Linux host archive.
+
+**Windows publishes nothing.** There is no Windows executable, no Windows
+installer package, no Windows update manifest, no Electron host on Windows and
+nothing to code-sign, so no signing status exists to record or disclose. A
+Windows host is the Linux host
+running inside a per-user WSL 2 distribution named `1helm`, installed from
+`https://1helm.com/install.ps1`, with the browser as its interface at
+`http://localhost:8123`. `install.ps1`, `uninstall.ps1` and the keepalive payload
+are served from the site rather than attached to a release, so a release commit
+that changes them is not shipped until the site is deployed.
+
+All three platform lanes — macOS, Linux, and Windows — are mandatory even when a
+change appears platform-specific, because the application source and updater
+version advance together. Windows is accepted by **behaviour** rather than by
+artifact, and since a Windows host installs the Linux archive, a Linux artifact
+that has not passed acceptance blocks Windows too. Do not tag, create or publish
+a GitHub Release, mark it latest, or update public download/feed metadata until
+every lane is built where it has an artifact, digest-verified, installed, and
+update-tested from the previous release. If any lane is unavailable or fails,
+pause the whole release. Never publish a Mac-only or otherwise partial set under
+the product version.
Mobile distribution may have additional store/signing timing, but it never
weakens the Mac + Linux + Windows desktop invariant.
@@ -45,10 +59,11 @@ weakens the Mac + Linux + Windows desktop invariant.
exact-commit candidates on every desktop lane
│
v
- Mac DMG + ZIP · Linux host archive · Windows Setup + nupkg + RELEASES
+ Mac DMG + ZIP · Linux host archive (Windows publishes no artifact)
│
v
clean install + prior→new updater acceptance on Mac, Linux, and Windows
+ (Windows via the site-served install.ps1 into WSL 2)
│
v
full numbered notes · tag · one complete GitHub Release
@@ -116,11 +131,13 @@ Draft PRs are allowed for long slices; mark ready only when the quality bar is m
user-visible item must appear once, with the same numbering as the request
when available. Include additional fixes, artifacts/digests, and verification
evidence in their own sections.
-6. Before creating the tag or GitHub Release, finish the complete desktop
- matrix from the exact merged commit: verified macOS DMG + updater ZIP,
- Linux host archive, and Windows Setup + full `.nupkg` + literal `RELEASES`
- manifest. Record whether Windows artifacts are trusted-signed or unsigned;
- unsigned is accepted until 1Helm adopts a trusted Windows signing identity.
+6. Before creating the tag or GitHub Release, finish the complete three-artifact
+ desktop matrix from the exact merged commit: verified macOS DMG
+ (`1Helm--arm64.dmg`), macOS updater ZIP
+ (`1Helm--mac-arm64.zip`), and Linux host archive
+ (`1Helm--linux-node.tgz`). Windows produces no artifact and has no
+ signing status to record; complete its behavioural acceptance instead
+ (`docs/release-checklist.md` Section 7).
7. Publish those desktop artifacts and complete release notes together through
one GitHub Release. Never publish a subset or attach a platform later to a
version already described as complete. Include a directly distributed
@@ -152,10 +169,10 @@ workspace state.
| Code landed | On `origin/main`, CI green |
| Behavior fixed | Tests + manual/API check |
| Install path still works | Clean `CTRL_DATA_DIR` boot through the wizard plus platform acceptance |
-| Named desktop release | One version/commit, changelog, full numbered notes, exact tag, complete Mac + Linux + Windows asset matrix, and clean installation evidence for all three |
+| Named desktop release | One version/commit, changelog, full numbered notes, exact tag, the complete three-artifact matrix (`1Helm--arm64.dmg`, `1Helm--mac-arm64.zip`, `1Helm--linux-node.tgz`), and clean installation evidence on macOS, Linux, and Windows |
| Mac host update | Published notarized/stapled updater ZIP feed, installed-old-to-new acceptance, and preserved Application Support |
| Linux host update | Digest-qualified artifact, real systemd install/update, health check/rollback, and preserved `/var/lib/1helm-oci-v1` |
-| Windows host update | Setup + `.nupkg` + `RELEASES` with disclosed signature status, Squirrel install/update, shared-WSL OCI lifecycle smoke, and preserved current-generation app data |
+| Windows host | No artifact and no signing status. Install from `https://1helm.com/install.ps1` in a non-elevated PowerShell window with a single UAC prompt, the mid-install restart and resume, a keepalive surviving a reboot, `http://localhost:8123` reached from a browser, a prior-version update through the in-distribution Linux updater with `/var/lib/1helm-oci-v1` retained, and removal via `uninstall.ps1` |
If any platform artifact or acceptance run is skipped, the release is paused,
not partially shipped. Say exactly what is missing and do not call it “done.”
diff --git a/docs/release-notes-template.md b/docs/release-notes-template.md
index ebf1348..ad1b52b 100644
--- a/docs/release-notes-template.md
+++ b/docs/release-notes-template.md
@@ -24,13 +24,24 @@ so plainly instead of silently omitting it.
| `1Helm-x.y.z-arm64.dmg` | `` |
| `1Helm-x.y.z-mac-arm64.zip` | `` |
| `1Helm-x.y.z-linux-node.tgz` | `` |
-| `1Helm-x.y.z-windows-x64-setup.exe` | `` |
-| `1Helm-x.y.z-full.nupkg` | `` |
-| `RELEASES` | `` |
-Every desktop row is mandatory and must resolve to the same version and source
-commit. “Not applicable” is forbidden for macOS, Linux, or Windows. If any row
-is unavailable, this release must remain unpublished.
+These three rows are the whole desktop matrix. Every one is mandatory and must
+resolve to the same version and source commit. “Not applicable” is forbidden for
+macOS or Linux. If any row is unavailable, this release must remain unpublished.
+A release is complete only once macOS, Linux, and Windows have each been accepted.
+
+**Windows publishes no artifact.** A Windows host is the Linux host running
+inside a per-user WSL 2 distribution named `1helm`, installed with one command
+in an ordinary PowerShell window:
+
+```powershell
+irm https://1helm.com/install.ps1 | iex
+```
+
+That script, `uninstall.ps1` and the keepalive payload are served from
+`https://1helm.com`, not attached here. No Windows executable ships, so there is
+no code signing and no signature status to disclose. Do not add a Windows row to
+the table above; record Windows under Verification instead.
Source commit: ``
@@ -44,9 +55,14 @@ Source commit: ``
- For Linux, state archive/source/digest verification and the real prior-version
systemd update, health-check rollback, and `/var/lib/1helm-oci-v1`
preservation.
-- For Windows, state Authenticode status, Setup clean install, Squirrel
- prior-version update, shared-WSL OCI lifecycle smoke, loopback health, and app-data
- preservation.
+- For Windows, state the behavioural acceptance on real Windows 11 x64 hardware:
+ a clean install via `irm https://1helm.com/install.ps1 | iex` from a
+ non-elevated PowerShell window with exactly one UAC prompt, the mid-install
+ restart and the resumed second run as the same signed-in user, the keepalive
+ surviving a reboot with `1helm.service` active, a browser reaching
+ `http://localhost:8123` and completing onboarding, the prior-version update
+ through the in-distribution Linux updater with `/var/lib/1helm-oci-v1`
+ retained, and removal via the site-served `uninstall.ps1`.
- Name anything skipped or incomplete; do not call an incomplete release fully
verified.
diff --git a/package-lock.json b/package-lock.json
index a8d9dd8..d9afe7f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "1helm",
- "version": "0.0.38",
+ "version": "0.0.39",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "1helm",
- "version": "0.0.38",
+ "version": "0.0.39",
"hasInstallScript": true,
"license": "AGPL-3.0-only",
"dependencies": {
@@ -56,9 +56,7 @@
"@xterm/addon-fit": "^0.11.0",
"@xterm/xterm": "^6.0.0",
"electron": "43.1.1",
- "electron-winstaller": "^5.4.4",
"esbuild": "^0.28.1",
- "png-to-ico": "^3.0.1",
"puppeteer": "^25.3.0",
"sharp": "^0.35.3",
"typescript": "^7.0.2",
@@ -5801,13 +5799,6 @@
"node": "^12.20.0 || >=14"
}
},
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/cookie": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
@@ -5852,14 +5843,6 @@
"integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==",
"license": "MIT"
},
- "node_modules/cross-dirname": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz",
- "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
"node_modules/cross-env": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
@@ -6690,171 +6673,6 @@
"node": ">= 22.12.0"
}
},
- "node_modules/electron-winstaller": {
- "version": "5.4.4",
- "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.4.tgz",
- "integrity": "sha512-j9ETcBGJaXxAY/b6UBpR7LZfjdU4BAO+yvr4ifqHEdyuc3UNCy91PDGkWKY5UQ4coHNYfnwFggrqD6QPeFGAlg==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "@electron/asar": "^3.2.1",
- "debug": "^4.1.1",
- "fs-extra": "^7.0.1",
- "lodash": "^4.17.21",
- "semver": "^7.6.3",
- "temp": "^0.9.0"
- },
- "engines": {
- "node": ">=8.0.0"
- },
- "optionalDependencies": {
- "@electron/windows-sign": "^1.1.2"
- }
- },
- "node_modules/electron-winstaller/node_modules/@electron/asar": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz",
- "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "commander": "^5.0.0",
- "glob": "^7.1.6",
- "minimatch": "^3.0.4"
- },
- "bin": {
- "asar": "bin/asar.js"
- },
- "engines": {
- "node": ">=10.12.0"
- }
- },
- "node_modules/electron-winstaller/node_modules/@electron/windows-sign": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz",
- "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "optional": true,
- "dependencies": {
- "cross-dirname": "^0.1.0",
- "debug": "^4.3.4",
- "fs-extra": "^11.1.1",
- "minimist": "^1.2.8",
- "postject": "^1.0.0-alpha.6"
- },
- "bin": {
- "electron-windows-sign": "bin/electron-windows-sign.js"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/electron-winstaller/node_modules/@electron/windows-sign/node_modules/fs-extra": {
- "version": "11.4.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz",
- "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/electron-winstaller/node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/electron-winstaller/node_modules/brace-expansion": {
- "version": "1.1.16",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz",
- "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/electron-winstaller/node_modules/commander": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
- "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/electron-winstaller/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/electron-winstaller/node_modules/jsonfile": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
- "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/electron-winstaller/node_modules/minimatch": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
- "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/electron-winstaller/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
"node_modules/electron/node_modules/@types/node": {
"version": "24.13.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz",
@@ -7187,28 +7005,6 @@
"license": "MIT",
"optional": true
},
- "node_modules/fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true,
- "license": "ISC"
- },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -7442,18 +7238,6 @@
"url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
@@ -7638,16 +7422,6 @@
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"license": "MIT"
},
- "node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
- "license": "MIT",
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
"node_modules/jszip": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
@@ -8241,13 +8015,6 @@
"url": "https://github.com/sponsors/antonk52"
}
},
- "node_modules/lodash": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
- "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/lodash-es": {
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
@@ -8507,8 +8274,8 @@
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "devOptional": true,
"license": "MIT",
+ "optional": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -8543,19 +8310,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
"node_modules/mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
@@ -8763,8 +8517,8 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "devOptional": true,
"license": "ISC",
+ "optional": true,
"dependencies": {
"wrappy": "1"
}
@@ -8882,16 +8636,6 @@
"integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==",
"license": "MIT"
},
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -9056,51 +8800,6 @@
"crc-32": "^0.3.0"
}
},
- "node_modules/png-to-ico": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/png-to-ico/-/png-to-ico-3.0.1.tgz",
- "integrity": "sha512-S8BOAoaGd9gT5uaemQ62arIY3Jzco7Uc7LwUTqRyqJDTsKqOAiyfyN4dSdT0D+Zf8XvgztgpRbM5wnQd7EgYwg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "^22.10.3",
- "minimist": "^1.2.8",
- "pngjs": "^7.0.0"
- },
- "bin": {
- "png-to-ico": "bin/cli.js"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/png-to-ico/node_modules/@types/node": {
- "version": "22.20.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz",
- "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~6.21.0"
- }
- },
- "node_modules/png-to-ico/node_modules/undici-types": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
- "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/pngjs": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz",
- "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14.19.0"
- }
- },
"node_modules/points-on-curve": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-1.0.1.tgz",
@@ -9492,73 +9191,6 @@
"node": ">= 4"
}
},
- "node_modules/rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/rimraf/node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/rimraf/node_modules/brace-expansion": {
- "version": "1.1.16",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz",
- "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/rimraf/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rimraf/node_modules/minimatch": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
- "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/robust-predicates": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz",
@@ -10201,20 +9833,6 @@
"node": ">=18"
}
},
- "node_modules/temp": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz",
- "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mkdirp": "^0.5.1",
- "rimraf": "~2.6.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/through2": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
@@ -10366,16 +9984,6 @@
"pathe": "^2.0.3"
}
},
- "node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/untildify": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
@@ -10663,8 +10271,8 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "devOptional": true,
- "license": "ISC"
+ "license": "ISC",
+ "optional": true
},
"node_modules/ws": {
"version": "8.21.1",
diff --git a/package.json b/package.json
index 317c8ed..127e0bb 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "1helm",
"productName": "1Helm",
- "version": "0.0.38",
+ "version": "0.0.39",
"private": true,
"type": "module",
"license": "AGPL-3.0-only",
@@ -50,8 +50,6 @@
"package:dmg:release": "HELM_REQUIRE_NOTARIZATION=1 node scripts/package-mac-dmg.cjs",
"package:channel-image": "bash scripts/build-oci-channel-image.sh",
"package:linux": "node scripts/package-linux-host.mjs",
- "package:windows": "node scripts/package-windows.cjs",
- "package:windows:release": "set HELM_REQUIRE_WINDOWS_SIGNATURE=1&& node scripts/package-windows.cjs",
"package:android:release": "node scripts/package-android-apk.mjs",
"package:ios:release": "node scripts/package-ios-ipa.mjs",
"test:desktop": "node --test test/desktop.mjs",
@@ -104,9 +102,7 @@
"@xterm/addon-fit": "^0.11.0",
"@xterm/xterm": "^6.0.0",
"electron": "43.1.1",
- "electron-winstaller": "^5.4.4",
"esbuild": "^0.28.1",
- "png-to-ico": "^3.0.1",
"puppeteer": "^25.3.0",
"sharp": "^0.35.3",
"typescript": "^7.0.2",
diff --git a/public/index.html b/public/index.html
index 36115f8..7cceecb 100644
--- a/public/index.html
+++ b/public/index.html
@@ -30,12 +30,12 @@
document.querySelectorAll('meta[name="theme-color"]').forEach(function (m) { m.setAttribute("content", color); });
})();
-
+
-
+