中文 | English
A single-repo workspace aggregating every project required to ship Pi (an extensible agent harness) and its browser UI Pi Web as desktop apps on four platforms, in three product forms: Pi Desktop (Electron shell · Windows / macOS / Linux) · Pi Desktop · Electron on HarmonyOS Edition (
pi-desktop-hos) · Pi Desktop · HarmonyOS Edition (pi-desktop-ark, ArkWeb + a real in-process Node runtime from the@fellow99/node-bridge+@fellow99/node-runtimeohpm packages). The upstream repositories, the two runtimes and the brand material sit side by side as git submodules plus plain sibling directories, so the workspace layout reproduces the exact sibling-directory structure each wrapper's build scripts expect (../pi,../pi-web,../assets,../harmonypc-electron).
Pi is an upstream open-source, extensible agent harness (MIT, earendil-works/pi)
with four integration entry points — CLI / RPC / JSON / SDK. Pi Web is its community browser UI (MIT,
agegr/pi-web) where a single Node process serves both the SPA and /api/*, and
the agent is created inside that process. Three wrapper projects move this whole stack onto the desktop
(the HarmonyOS Edition's Node runtime ships as two ohpm packages, @fellow99/node-bridge + @fellow99/node-runtime):
pi-desktop— an Electron desktop shell (Windows / macOS / Linux), Electron 43.7.9: the main process hostspi-web's Next server (agent and/api/*included) in-process, and the renderer loads the official Pi Web UI from that same origin.pi-desktop-hos— Pi Desktop · Electron on HarmonyOS Edition: a HarmonyOS PC / tablet port built on the Electron-on-HarmonyOS runtime fromharmonypc-electron(Electron 37.2.3 / Node 22.17.0), packaged as a signable, distributable HAP.pi-desktop-ark— Pi Desktop · HarmonyOS Edition: the same product without Chromium or Electron — an ArkTS host whose ArkWeb view loads the localpi-webserver, which runs on a real Node.js runtime embedded in the app process (@fellow99/node-bridge+@fellow99/node-runtime:dlopen+node::Start). Smaller payload, system WebView, no Electron runtime; functional target is parity with the Electron on HarmonyOS Edition.@fellow99/node-bridge/@fellow99/node-runtime— the runtime packages behind the HarmonyOS Edition (an ArkTS HAR + NAPI loader, plus the Node engine as a separate HAR; both published on the OpenHarmony ohpm registry, source: github.com/fellow99/ohos-node-bridge). They are not an app and not an edition — they are the pieces that let any HarmonyOS application host Node in-process. Their only registered consumer ispi-desktop-ark(regular ohpm dependency, no side-by-side checkout needed).
The wrappers only assemble: the UI is reused 100% from upstream and no upstream source is forked (see
pi-desktop/docs/工程规划.md §1.1–§1.2, pi-desktop-hos/docs/工程规划.md §1.1–§1.2,
pi-desktop-ark/docs/000-工程规划.md). Patch policy is counted per edition: the desktop shell ships 0 patches,
the Electron on HarmonyOS Edition 2 registered patches, and the HarmonyOS Edition applies its pi-web patches as
idempotent, reversible files (pi-desktop-ark/patches/v0.12.1/, 5 at v0.12.1).
This repository itself contains no product code — it is the container that holds these projects, so every sibling directory reference resolves as soon as the workspace is cloned.
pi-workspace/ # this repo — submodule container (the parent project)
├── pi/ # [submodule] upstream agent harness (host + SDK, MIT)
├── pi-web/ # [submodule] upstream browser UI + Next server (MIT)
├── pi-desktop/ # [submodule] Electron desktop shell (Windows / macOS / Linux)
├── pi-desktop-hos/ # [submodule] Pi Desktop · Electron on HarmonyOS Edition (HAP)
├── pi-desktop-ark/ # [submodule] Pi Desktop · HarmonyOS Edition (ArkWeb + in-process Node, HAP)
├── pi-desktop-website/ # [submodule] product website of the three wrappers (static, two pages)
├── harmonypc-electron/ # [submodule] Electron-on-HarmonyOS runtime (Electron 37.2.3 / Node 22.17.0)
├── assets/ # (plain dir) single source of brand material: logo.* + screenshots/
├── harmonypc-electron-versions/ # (plain dir, not in git) runtime release archives + native-module guides
└── LICENSE · README.md · README_zh.md
| Directory | Role | Consumed by |
|---|---|---|
pi |
Upstream agent harness (host + SDK) | all wrappers (source reference and upstream pin baseline) |
pi-web |
Upstream browser UI + Next server | all wrappers (its production build is collected at build time) |
pi-desktop |
Electron desktop shell (Windows / macOS / Linux) | — |
pi-desktop-hos |
Pi Desktop · Electron on HarmonyOS Edition (HAP) | — |
pi-desktop-ark |
Pi Desktop · HarmonyOS Edition (HAP) | — |
@fellow99/node-bridge + @fellow99/node-runtime (ohpm) |
In-process Node runtime packages (source: ohos-node-bridge) |
pi-desktop-ark |
pi-desktop-website |
Product website of the three wrappers | — |
harmonypc-electron |
Electron-on-HarmonyOS runtime (native SOs + ArkTS shell) | pi-desktop-hos only |
assets |
The single source of brand material: app icons / window icons / status-bar glyphs / page logo for the wrappers, plus the website's logo and screenshots | all wrappers + the website |
harmonypc-electron-versions |
Runtime release archives (v34 / v37) + material for rebuilding native modules | harmony tooling |
assets/— brand material:logo.svg,logo.png,logo-1024-with-bg.png,logo-200-with-bg.png,logo.ico,logo.icns, plusscreenshots/(pc/andhos/;pc/currently holds1.png–6.png,hos/is still empty ⬜). It is not shipped with any wrapper; instead the wrappers' brand-resource scripts and the website read it as their only source of material, which is why it has to stay a sibling of all of them.harmonypc-electron-versions/— the HarmonyOS runtime release archives and native-module build guides:v34.8.5-*.zip,v37.2.3-*.zip,electron144_ohos_hap/,libelectron/,better-sqlite3编译指导(Electron37)/, and two archives of Node-header (Headers) usage guides for Electron 34 / 37. Use them when you need a runtime version other than the pinned submodule, or when rebuilding a native module (such asbetter-sqlite3) for the HarmonyOS side. The directory is not in version control (.gitignorecarries a/harmonypc-electron-versionsentry);assets/is likewise currently untracked by git.
Every build script of the wrappers derives upstream and material paths from "the parent of this project's root", and there is no fallback to an installed location:
| Sibling path needed | File-level evidence |
|---|---|
../pi-web |
pi-desktop/scripts/prepare-next.mjs, collect-pi.mjs, smoke-desktop.mjs (REPO_PARENT = resolve(ROOT, '..'), then join(REPO_PARENT, 'pi-web')); pi-desktop-hos/scripts/prepare-next.mjs, collect-pi.mjs, smoke-node22.mjs |
../pi |
pi-desktop/scripts/pin-upstream.mjs (writes the commit / describe / branch of ../pi and ../pi-web into upstream.lock.json); pi-desktop-hos/scripts/prepare-next.mjs (hard existence check: pi-web's @earendil-works/* resolves through the sibling ../pi); pi-desktop/.github/workflows/ci.yml |
../assets |
pi-desktop/scripts/brand-assets.mjs and pi-desktop-hos/scripts/brand-assets.mjs (the material directory defaults to the parent project's ../assets, falling back to the in-repo mirror resources/brand/ only when it is absent) |
../harmonypc-electron |
pi-desktop-hos/scripts/collect-runtime.mjs (copies the runtime shell from the sibling ../harmonypc-electron/ohos_hap) |
../harmonypc-electron-versions |
pi-desktop-hos/scripts/collect-runtime.mjs (that stage unpacks the v37 archive from the same-named directory for native SOs and Chromium resources) |
These projects therefore must live under the same parent directory, with unchanged directory names: cloning a single
wrapper elsewhere, or moving upstream somewhere else, breaks the build outright (pi-desktop-hos/scripts/prepare-next.mjs
fails when ../pi-web / ../pi is missing; pi-desktop/scripts/brand-assets.mjs fails just as hard when neither the
parent material nor the in-repo mirror exists). CI works on the same assumption: the file header of
pi-desktop/.github/workflows/ci.yml states that "CI only checks out this repository, while the build scripts resolve
upstream sources at ../pi and ../pi-web", so it git clones both into siblings of pi-desktop.
The data plane is shared: all three wrappers take the same shape — an in-process Next server from pi-web, with
the view loading it same-origin. On the Electron shells (pi-desktop, and pi-desktop-hos on the Electron-on-HarmonyOS
runtime) the agent and /api/* live inside the Electron main process; on the HarmonyOS Edition they live inside the
HarmonyOS app process itself (ArkWeb + embedded Node). Either way there is no CORS, no custom protocol, no login page,
and zero upstream source changes. Differences are confined to the runtime and platform integration (runtime version,
packaging form, network binding, platform capability gaps) and are documented by each wrapper's own README and
docs/工程规划.md; the HarmonyOS Edition's runtime contract lives in ohos-node-bridge docs/000-工程规划.md §6.
All entries are recorded in .gitmodules:
| Path | Remote |
|---|---|
pi |
https://github.com/earendil-works/pi.git |
pi-web |
https://github.com/agegr/pi-web.git |
pi-desktop |
https://github.com/fellow99/pi-desktop.git |
pi-desktop-hos |
https://github.com/fellow99/pi-desktop-hos.git |
pi-desktop-ark |
https://github.com/fellow99/pi-desktop-ark.git |
pi-desktop-website |
https://github.com/fellow99/pi-desktop-website.git |
harmonypc-electron |
https://github.com/fellow99/harmonypc-electron.git |
git clone --recursive https://github.com/fellow99/pi-workspace.git
cd pi-workspace
git submodule update --init --recursive # fetch/refresh all pinned submodules
assets/andharmonypc-electron-versions/are not in version control and will not show up after cloning; prepare them yourself per "The two plain directories" above when you need to build brand resources or a HarmonyOS runtime archive (without the former, the desktop wrapper falls back to the in-repo mirrorresources/brand/; the harmony wrapper'scollect-runtimeneeds the v37 archive from../harmonypc-electron-versions).
To advance the pinned commits, run git submodule update --remote and commit the new pointers.
| Item | Status |
|---|---|
| Upstream baseline | pi v1.1.0 (Branch_v1.1.0) + pi-web v0.11.1 (Branch_v0.11.1); pinned commits recorded in pi-desktop/upstream.lock.json |
pi-desktop |
Version 0.11.1; packaged-state end-to-end measured on Windows (in-process host / first screen / artifact bootstrap / branding / terminal PTY / native notifications / install-launch-uninstall ✅, see docs/构建验证记录.md rounds 1–2); macOS / Linux still unverified; visual presentation of the system tray ⬜ not yet separately verified (docs/桌面能力清单.md) |
pi-desktop-hos · Electron on HarmonyOS Edition |
Version 0.11.1 / versionCode 1101; built, signed and verified on device (HarmonyOS 6.1.0.135 / API 24, see docs/真机验证记录.md); capability boundaries in docs/鸿蒙环境能力清单-v0.11.1.md |
pi-desktop-ark · HarmonyOS Edition |
Skeleton + Phase 1 capabilities on device: in-process Node v24.2.0, in-process Next server, ArkWeb UI, file-mailbox host bridge, permissions/pickers/notifications; real-device verified on HUAWEI MateBook Pro (HAD-W24, API 26). Capability record: docs/001-能力复刻评估.md |
| Runtime packages | @fellow99/node-bridge 0.1.0 + @fellow99/node-runtime 24.2.0, both published on the OpenHarmony ohpm registry (2026-10-22); consumed by pi-desktop-ark as a regular ohpm dependency |
| Upstream changes | 0 required patches in the desktop shell, 2 registered patches in the Electron on HarmonyOS Edition, 5 idempotent patch files in the HarmonyOS Edition (pi-desktop-ark/patches/v0.12.1/) — no upstream source is forked |
pi-desktop-website |
Static two-page site (index.html / index_zh.html, no framework, zero external requests), deployed to GitHub Pages via GitHub Actions |
| This repo | Bilingual README (README_zh.md original / README.md translation) + MIT LICENSE; assets/ and harmonypc-electron-versions/ are local plain directories, untracked |
| Open ⬜ | no screenshots yet in assets/screenshots/hos/; packaged-state verification on macOS / Linux; separate verification of the tray and its high-DPI / light-dark presentation |
The authoritative word on capabilities and verification state is each product repo's own documentation — this file is only an overview and may lag behind it.
This repository: MIT © 2026 fellow99.
Each subproject keeps its own license and this repository does not change them: pi is MIT (earendil-works/pi,
© 2025 Mario Zechner), pi-web is MIT (agegr/pi-web, © 2026 agegr), and the wrappers, the website and the runtimes
each carry their own in-repo LICENSE (MIT). When reusing content from a subdirectory, that directory's LICENSE
governs.
The desktop wrappers aggregated by this workspace are third-party projects: they are not products of the Pi or
Pi Web teams and have no affiliation with, and no endorsement from, the upstream authors. Pi (MIT,
earendil-works/pi) and Pi Web (MIT, agegr/pi-web) are upstream open-source projects owned by their respective authors;
the wrappers merely assemble them — no fork, no upstream source changes. harmonypc-electron belongs to its own
authors; this repository only references it as a sibling.