DeepSeek Harness plugin

dsh-pwa

DSH PWA plugin: serves manifest + service worker + installable icons, with basePath support for reverse-proxy deployments

Jump to install

Source facts

Repository
haoliangwu/dsh-pwa
Latest update
Aug 20, 2026
Category
Models & Providers
GitHub stars
0
Format
plugin
Catalog evidence
Upstream dsh.bundle evidence
Evidence path
package.json#dsh.bundle
Checked against
0.1.0-rc.8
Upstream check date
2026-08-21

This evidence comes from the upstream catalog. This site has not installed, run, or security-reviewed the plugin.

Install

Start with a prompt that asks an agent to review the GitHub repository and source. Switch to the command if you want to install it yourself.

Copy this prompt into DSH, Codex, or another agent and ask it to review the GitHub repository and source first.

Do not install or run any commands yet. Read this plugin's GitHub repository, README, and relevant source code. Then answer the questions below clearly and directly so I can decide whether it fits my needs:

1. What is this plugin, and what problem does it solve?
2. Who is it for, and what are its typical use cases?
3. How is it used after installation? Include one minimal example.
4. What known limitations or privacy, security, compatibility, or maintenance risks does it have?
5. Give a clear recommendation: recommend, conditionally recommend, or do not recommend, with reasons.

Distinguish statements documented by the repository, inferences from source code, and unknowns. If evidence is insufficient, say so explicitly. Do not guess or simply repeat the README.

GitHub: https://github.com/haoliangwu/dsh-pwa
Plugin: dsh-pwa
Author: haoliangwu

Check the source files

Read the README and other files from this plugin directory before installing.

File explorer3 files
README.mdSource · read only

<h1 align="center">dsh-pwa</h1>

<p align="center">Makes a running dsh web instance installable as a PWA — manifest + service worker + icons, with basePath support for reverse-proxy deployments.</p>

<p align="center"><img src="docs/pwa-standalone-window.png" alt="DeepSeek Harness PWA running as a standalone macOS app window" width="640"></p>

A pure host-side plugin for DeepSeek Harness. The web frontend already ships a manifest and favicon in its dist, but no service worker or SW registration script — so Chrome's installability check fails. This plugin fills that gap and lets the app be mounted under a reverse-proxy sub-path.

Install

dsh plugin --profile web add github:haoliangwu/dsh-pwa

Built lib/ and assets/ are committed, so the git install is one line — no prepare script, no build step. Restart dsh --profile web after install (bundle layer stacks compose at boot).

Configure

basePath defaults to / (install at the origin root). For a reverse-proxy deployment mounted at /dsh/, add the plugin to your profile's cordis.patch.yml (~/.dsh/profiles/web/cordis.patch.yml) via the insert form (the config-overlay form only tunes plugins already listed in dsh.profile.bundles):

- insert:
    - id: dsh-pwa
      name: dsh-pwa
      config:
        basePath: /dsh/

After a dsh plugin add install, the bare - id: dsh-pwa row is already in place; only append the config: block to tune basePath.

Normalization applies automatically: ''/'/''/', '/dsh''/dsh/', 'dsh/''/dsh/', '/dsh/' unchanged. Values containing ? or # are rejected.

How it works

On apply(ctx, config), the plugin registers five WebServer routes under ${basePath}pwa/*:

  • manifest.webmanifest → the web manifest, built in JS with basePath-rooted URLs, served as application/manifest+json
  • sw.jsassets/sw.js, served as text/javascript
  • icon-192.png / icon-512.pngassets/icon-192.png / assets/icon-512.png, served as image/png
  • favicon.svgassets/favicon.svg, served as image/svg+xml

Each static asset is read once at apply time and cached in the handler closure (no per-request disk reads), and the returned disposers are released through ctx.effect so HMR/unload cleans up.

It also taps ctx.webServer.tapIndex(transform) to rewrite index.html:

  • repoints <link rel="manifest"> to ${basePath}pwa/manifest.webmanifest
  • repoints <link rel="icon" ...> to ${basePath}pwa/favicon.svg
  • injects before </body> a serviceWorker.register('${basePath}pwa/sw.js', { scope: '${basePath}' }) script

Verify

1. Start dsh --profile web. 2. Open Chrome DevTools → Application panel → Manifest. Confirm the name, icons (192/512/svg), and start_url/scope rooted at basePath. 3. ApplicationService Workers should list one active worker from ${basePath}pwa/sw.js. 4. Open Lighthouse (or check Application → the installability banner) — the site should now pass the install checklist and show beforeinstallprompt on first visit.

Build from source

pnpm install
pnpm gen-icons   # regenerates assets/icon-192.png + assets/icon-512.png from assets/favicon.svg
pnpm build       # emits lib/index.js, lib/invariant.js
pnpm test        # config normalization + manifest/tapIndex unit tests

lib/ and assets/ are committed so git installs work without a build step. After changing source, run pnpm build (and pnpm gen-icons when the icon source changes) and commit both trees.

License

MIT