npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsh-web-push-notification

v0.2.1

Published

Web Push notifications for DeepSeek Harness

Readme

dsh-web-push-notification

CI npm version License

Receive notifications when a DeepSeek Harness task completes, stops, or needs your approval or response.

Install

These examples use the web profile. Replace web with your profile name in each command and path.

Install the plugin into the profile you want to notify:

dsh plugin --profile web add dsh-web-push-notification

Set the VAPID contact URI in $DSH_HOME/profiles/web/cordis.patch.yml:

- id: dsh-web-push-notification
  config:
    vapidSubject: 'mailto:[email protected]'

Use your own mailto: URI or https: URL for vapidSubject. This contact address is independent of the address used to open Harness.

Restart the profile after installation:

dsh --profile web

Open Harness over HTTPS unless you access it through a loopback address. On iOS and iPadOS, add it to the Home Screen before enabling Web Push. The Harness host needs outbound access to the browser's push service; it does not need a public inbound endpoint for push delivery.

Open Settings → Notifications, enable Web Push, and use Send test. Optional Title and Body fields customize only the test notification; blank fields use the displayed defaults. Test notifications go to all registered devices and bypass activity suppression.

If a push service rejects an expired subscription or its VAPID credentials, the host removes that record. Send test reports the delivery counts and whether this device remains registered. Use Enable Web Push again on an affected device to create a subscription with the current keys.

Notification behavior

Each browser or installed PWA stores its notification preferences separately. These event types are enabled by default:

  • Task completed
  • Task stopped or failed
  • Approval required
  • Response required

Subagent runs is off by default. Enable it to receive notifications from subagent sessions in addition to the parent session.

Full content includes the latest response, question, or approval reason. Summary only omits those details from the body. Titles include the event kind and session name in both modes, for example Done · Fix the paste bug. Bodies convert Markdown to plain text. Push payloads are encrypted to the subscription's p256dh key; the push service receives ciphertext.

Tapping a notification focuses an existing Harness window and opens its session, or opens a new window. Browsers that support notification actions also show Open and Dismiss. Repeated notifications for the same session and event kind replace the previous row and alert again. Push messages expire after 24 hours; approval, question, and failure messages use high urgency, while completed turns use normal urgency.

Activity suppression

Notifications are suppressed while any Harness page is focused, visible, and recently used, across all devices. A page stops suppressing notifications after ten minutes without input, or after one minute without a presence report. Pointer movement counts as activity.

In Settings → Notifications → While you are using Harness, disable suppression or set the idle threshold from one to thirty minutes. These settings are shared by all devices in the profile. Open pages adopt changes on their next presence report.

Storage and upgrades

VAPID keys, subscriptions, and suppression settings are stored in $DSH_HOME/profiles/web/web-push/state.json, outside the profile's installed package directory. Each profile has its own state. Set storagePath in the plugin configuration to use another location.

On first startup with no state at the default path, the plugin adopts a readable legacy state file belonging to the profile, including its keys, subscriptions, and suppression settings. The most recently modified profile-owned file takes precedence. Legacy candidates include the profile's web-push.json and bundle-local web-push.json files.

If no readable profile-owned predecessor exists, the shared $DSH_HOME/web-push/state.json supplies fallback VAPID keys. Its subscriptions and settings are not imported because their owning profile is unknown. Devices using the inherited keys register again when their Notifications settings load. A device using a different key pair must enable Web Push again. Legacy files remain available for recovery; existing state at the configured path takes precedence over migration. Setting an explicit storagePath disables automatic legacy adoption.

Service Worker and endpoints

The worker at /__dsh/web-push/sw.js uses scope /__dsh/web-push/, so it can coexist with a root-scope PWA worker. It handles push events and subscription rotation, has no fetch handler, and caches no page content.

Configuration, subscription, presence, settings, and test routes use the Harness session authentication gate. Subscription endpoints must use HTTPS; literal private, loopback, and link-local addresses are rejected. DNS names that resolve to private addresses are not filtered. Authentication restricts access to these routes; it does not prevent an authenticated caller from submitting such a DNS name.

Notification artwork is served without session authentication at /__dsh/web-push/notification-icon.png and /__dsh/web-push/notification-badge.png, so browsers can fetch it without an app cookie. The large icon is transparent to avoid adding another visible icon; the badge is a monochrome silhouette. Both files derive from the Harness app mark and are covered by Third-Party Notices.

Development

Use the pnpm version declared in package.json:

pnpm install --frozen-lockfile
pnpm run check

The check runs formatting, lint, typechecking, unit tests, and the distribution build. CI also checks against the latest stable Harness release, or the latest release candidate when no stable release exists.

Harness compatibility

The declared compatibility range is DeepSeek Harness >=0.2.0-rc.2.

License

The project is licensed under MIT. See Third-Party Notices for bundled artwork and runtime dependency notices.